856 lines
36 KiB
Markdown
856 lines
36 KiB
Markdown
# Chat de WhatsApp - Propuestas Ejecutadas
|
|
|
|
> Workflow n8n que permite registrar propuestas ejecutadas y propuestas externas desde WhatsApp, analizar evidencias con IA, generar una presentación automática, guardar el reporte en Google Sheets y relacionarlo con el banco original de propuestas cuando existe un match confiable.
|
|
|
|
---
|
|
|
|
## INFORMACIÓN GENERAL
|
|
|
|
| Campo | Detalle |
|
|
| ------------------------ | -------------------------------------------------------- |
|
|
| Proyecto | Chat de WhatsApp - Propuestas Ejecutadas |
|
|
| Área | CDC |
|
|
| Estado | Versión Final |
|
|
| Developer Principal | Isaac Aracena |
|
|
| IT Manager | Luis Matos |
|
|
| Product Owner | Máximo Gómez |
|
|
| Ciclo Shape Up | CDC Fulgencio V2.0 |
|
|
| Repositorio Gitea | `chat-de-whatsapp-propuestas-ejecutadas` |
|
|
| Workflow n8n | Chat de WhatsApp - Propuestas Ejecutadas - Versión Final |
|
|
| Estado del workflow | Activo |
|
|
| Canal principal | WhatsApp |
|
|
|
|
|
|
---
|
|
|
|
## OBJETIVO
|
|
|
|
### Problema que resuelve
|
|
|
|
Antes de este workflow, las evidencias de propuestas ejecutadas o propuestas externas podían recibirse por mensajes sueltos, fotos, videos o notas de voz sin una estructura clara. Esto dificultaba mantener trazabilidad, generar presentaciones de ejecución, relacionar la evidencia con propuestas originales y alimentar correctamente el ecosistema de Fulgencio.
|
|
|
|
El proceso manual también podía provocar pérdida de evidencias, duplicidad de links, falta de resumen ejecutivo, archivos desorganizados en Drive y poca visibilidad para futuras consultas desde FulgencioChat.
|
|
|
|
### Solución implementada
|
|
|
|
Este workflow permite que los usuarios autorizados registren evidencias desde un grupo oficial de WhatsApp. El bot guía al usuario por un flujo controlado:
|
|
|
|
1. Inicio del reporte.
|
|
2. Nota de voz obligatoria.
|
|
3. Imágenes obligatorias.
|
|
4. Videos opcionales.
|
|
5. Análisis con Gemini.
|
|
6. Generación de presentación.
|
|
7. Registro en Google Sheets.
|
|
8. Organización de evidencias en Drive.
|
|
9. Relación con el banco original si hay match confiable.
|
|
10. Respuesta final por WhatsApp con el link de presentación.
|
|
|
|
El flujo soporta propuestas ejecutadas y propuestas externas. Si la ejecución corresponde con alta confianza a una propuesta del banco original, actualiza el banco con el enlace de la presentación ejecutada. Si no hay match suficiente, registra el caso sin modificar el banco original.
|
|
|
|
### Usuarios / Beneficiarios
|
|
|
|
| Usuario | Beneficio |
|
|
| --------------------------- | ----------------------------------------------------------------------- |
|
|
| Managers / equipo operativo | Pueden registrar evidencias directamente desde WhatsApp. |
|
|
| Equipo CDC | Recibe presentaciones de ejecución ordenadas y consultables. |
|
|
| Equipo IT | Mantiene trazabilidad técnica y control del flujo automatizado. |
|
|
| FulgencioChat V3 | Puede consultar luego las propuestas ejecutadas y externas. |
|
|
| Responsables de proyectos | Tienen visibilidad sobre ejecuciones reales y evidencias. |
|
|
| GomezLee Marketing | Centraliza información histórica para futuras propuestas y referencias. |
|
|
|
|
---
|
|
|
|
## ARQUITECTURA
|
|
|
|
### Diagrama de flujo
|
|
|
|
```txt id="itjmke"
|
|
[Webhook Evolution WhatsApp]
|
|
↓
|
|
[Normalizar evento WhatsApp]
|
|
↓
|
|
[Filtro origen / grupo permitido]
|
|
↓
|
|
[Leer sesiones existentes]
|
|
↓
|
|
[Resolver sesión]
|
|
↓
|
|
[Switch decisión sesión]
|
|
├── Crear sesión
|
|
├── Continuar sesión
|
|
├── Cancelar sesión
|
|
└── Avisos controlados
|
|
|
|
[Flujo activo]
|
|
↓
|
|
[Audio obligatorio]
|
|
↓
|
|
[Imágenes obligatorias]
|
|
↓
|
|
[Videos opcionales]
|
|
↓
|
|
[Enviar aviso procesando]
|
|
↓
|
|
[Recuperar media]
|
|
↓
|
|
[Subir evidencias a Drive]
|
|
↓
|
|
[Analizar audio / imágenes / videos con Gemini]
|
|
↓
|
|
[Control Redis de conteo y lock]
|
|
↓
|
|
[Consolidar análisis multimedia]
|
|
↓
|
|
[Gemini genera JSON final]
|
|
↓
|
|
[Match contra Banco de Propuestas]
|
|
↓
|
|
[Guardar propuesta ejecutada / externa]
|
|
↓
|
|
[Crear carpeta y presentación]
|
|
↓
|
|
[Insertar imágenes y limpiar slides vacíos]
|
|
↓
|
|
[Actualizar links en Sheets]
|
|
↓
|
|
[Actualizar banco original si match alto]
|
|
↓
|
|
[Enviar mensaje final por WhatsApp]
|
|
```
|
|
|
|
### Stack tecnológico
|
|
|
|
| Componente | Tecnología | Propósito |
|
|
| ----------------------- | -------------------------- | ------------------------------------------------ |
|
|
| Automatización | n8n | Orquestación del flujo |
|
|
| Sesiones | Google Sheets | Controlar estado de cada reporte |
|
|
| Evidencias | Google Drive | Guardar audios, imágenes, videos y presentación |
|
|
| IA multimedia | Gemini | Analizar audio, imágenes y videos |
|
|
| IA final | Gemini | Generar JSON estructurado del reporte |
|
|
| Control de concurrencia | Redis | Contar análisis y evitar cierres duplicados |
|
|
| Registro operativo | Google Sheets | Guardar eventos, media, análisis y reporte final |
|
|
| Presentaciones | Google Slides / Drive | Crear presentación automática de ejecución |
|
|
| Banco original | Google Sheets | Relacionar ejecución con propuesta original |
|
|
| Versionado | Gitea | Backup del workflow y documentación |
|
|
|
|
### Integraciones externas
|
|
|
|
| Sistema | Tipo de integración | Datos que fluyen |
|
|
| ------------------- | ---------------------- | --------------------------------------------------------------- |
|
|
| Google Sheets | OAuth | Sesiones, eventos, media, análisis y reporte final |
|
|
| Google Drive | OAuth | Carpetas, evidencias y presentación generada |
|
|
| Google Slides API | OAuth / HTTP Request | Reemplazo de textos, inserción de imágenes y limpieza de slides |
|
|
| Gemini | API / n8n nodes | Análisis de audio, imagen, video y JSON final |
|
|
| Redis | Redis node | Conteo de análisis, locks y control de cierre |
|
|
| Banco de Propuestas | Google Sheets | Match y actualización de link ejecutado |
|
|
| Gitea | Git / backup | Export del workflow y README |
|
|
|
|
---
|
|
|
|
## FUENTES Y DESTINOS
|
|
|
|
### Google Sheet principal
|
|
|
|
| Campo | Detalle |
|
|
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
| Documento | Fulgencio - Propuestas Ejecutadas |
|
|
| Uso | Registro operativo del flujo de WhatsApp |
|
|
| Hojas principales | `wa_ejecuciones_sesiones`, `wa_ejecuciones_eventos`, `wa_ejecuciones_media`, `wa_ejecuciones_analisis_media`, `propuestas_ejecutadas` |
|
|
|
|
### Banco original de propuestas
|
|
|
|
| Campo | Detalle |
|
|
| ------------- | ----------------------------------------------------------------------------- |
|
|
| Documento | BANCO DE PROPUESTAS DE CDC PARA FULGENCIO FUMADO |
|
|
| Hoja | propuestas |
|
|
| Uso | Fuente para identificar si una ejecución corresponde a una propuesta original |
|
|
| Actualización | Solo cuando existe match de alta confianza |
|
|
|
|
### Google Drive
|
|
|
|
| Carpeta / Recurso | Uso |
|
|
| ------------------------ | -------------------------------------------------- |
|
|
| PROPUESTAS EJECUTADAS | Carpeta principal para evidencias y presentaciones |
|
|
| Carpeta por ejecución | Guarda audios, imágenes, videos y presentación |
|
|
| Template de presentación | Plantilla base para generar presentación final |
|
|
|
|
---
|
|
|
|
## REGLAS DE NEGOCIO
|
|
|
|
### Acceso y permisos
|
|
|
|
* El flujo está diseñado para operar desde un grupo oficial de WhatsApp.
|
|
* El permiso de uso se controla por pertenencia al grupo autorizado.
|
|
* Los mensajes que no provienen del grupo permitido deben bloquearse o ignorarse.
|
|
* En grupos, el bot debe identificar al usuario real mediante el participante del mensaje, no solo el ID del grupo.
|
|
* La respuesta debe enviarse al grupo cuando el reporte inicia desde el grupo.
|
|
|
|
### Comandos oficiales
|
|
|
|
| Comando | Uso |
|
|
| -------------- | ------------------------------------------- |
|
|
| `Hey` | Iniciar reporte |
|
|
| `FOTOS LISTAS` | Confirmar que terminó el envío de imágenes |
|
|
| `SIN VIDEO` | Cerrar reporte sin videos |
|
|
| `LISTO` | Cerrar reporte cuando sí se enviaron videos |
|
|
| `CANCELAR` | Cancelar reporte activo |
|
|
|
|
### Reglas del reporte
|
|
|
|
* Una propuesta por reporte.
|
|
* Una sesión activa por usuario dentro del grupo.
|
|
* Nota de voz obligatoria.
|
|
* Imágenes obligatorias.
|
|
* Videos opcionales.
|
|
* Las imágenes pueden enviarse juntas o separadas.
|
|
* Los videos deben enviarse uno por uno, en mensajes separados.
|
|
* No se deben mezclar evidencias de varias propuestas en un mismo reporte.
|
|
* El usuario no debe iniciar otro reporte hasta terminar o cancelar el actual.
|
|
|
|
### Reglas de sesión
|
|
|
|
* Al escribir `Hey`, si no existe sesión activa, se crea una nueva sesión.
|
|
* Si ya existe sesión activa, se informa al usuario que debe completar o cancelar la sesión actual.
|
|
* Si el usuario escribe `CANCELAR`, la sesión activa se cancela.
|
|
* Si el usuario escribe comandos fuera de etapa, el flujo responde con la instrucción correspondiente.
|
|
* Cuando el flujo pasa a procesamiento, no debe aceptar nuevos archivos para esa sesión.
|
|
|
|
### Reglas multimedia
|
|
|
|
* El audio se analiza como fuente principal de contexto.
|
|
* Las imágenes se analizan como evidencias visuales.
|
|
* Los videos se analizan solo si el usuario los envía.
|
|
* Si el usuario no tiene videos, debe escribir `SIN VIDEO`.
|
|
* Si envió videos, debe escribir `LISTO`.
|
|
* Cada archivo multimedia queda registrado con su tipo, nombre, mime type, link, Drive ID y sesión.
|
|
|
|
### Reglas de IA
|
|
|
|
Gemini debe analizar:
|
|
|
|
* Nota de voz.
|
|
* Imágenes.
|
|
* Videos opcionales.
|
|
* Contexto consolidado.
|
|
|
|
La salida final debe estructurar:
|
|
|
|
* Tipo de reporte.
|
|
* Marca.
|
|
* Cliente.
|
|
* País.
|
|
* Ubicación.
|
|
* Propuesta de referencia.
|
|
* Descripción de ejecución.
|
|
* Resumen IA.
|
|
* Elementos detectados.
|
|
* Tags.
|
|
* Match contra banco.
|
|
* Estado de revisión.
|
|
|
|
### Reglas para propuesta ejecutada
|
|
|
|
Una propuesta ejecutada es una implementación real relacionada con una propuesta o referencia del banco interno.
|
|
|
|
Si el match contra el banco original es alto:
|
|
|
|
* Se guarda la ejecución.
|
|
* Se genera presentación.
|
|
* Se actualiza el banco original con el link de la presentación ejecutada.
|
|
* Se evita duplicar el link si ya existía.
|
|
|
|
### Reglas para propuesta externa
|
|
|
|
Una propuesta externa es un reporte recibido fuera del banco interno o sin match confiable con una propuesta original.
|
|
|
|
En este caso:
|
|
|
|
* Se guarda en `propuestas_ejecutadas`.
|
|
* Se genera presentación.
|
|
* Se conserva la evidencia.
|
|
* No se actualiza el banco original automáticamente.
|
|
* Puede quedar marcada para revisión manual si aplica.
|
|
|
|
### Reglas de match
|
|
|
|
* Match alto: permite actualizar el banco original.
|
|
* Match bajo/manual: registra la ejecución, pero no actualiza el banco original.
|
|
* Sin match: registra como externa o revisión, sin modificar el banco original.
|
|
* No se debe afirmar relación definitiva si el match no es confiable.
|
|
|
|
### Reglas de duplicado
|
|
|
|
* Antes de guardar el reporte final, el flujo verifica si la propuesta ejecutada ya existe.
|
|
* Si ya existe, debe evitar guardar duplicados innecesarios.
|
|
* Si el banco original ya tiene link de ejecución, no debe duplicarlo.
|
|
* Los links nuevos deben agregarse solo cuando corresponde.
|
|
|
|
### Reglas de presentación
|
|
|
|
* La presentación se genera copiando una plantilla base.
|
|
* El flujo reemplaza textos con información del reporte.
|
|
* Inserta imágenes en los placeholders disponibles.
|
|
* Si hay menos imágenes que placeholders, se eliminan o limpian los slides vacíos configurados.
|
|
* La presentación final debe incluir link accesible para el equipo autorizado.
|
|
|
|
### Reglas de seguridad
|
|
|
|
* No commitear API keys, tokens, webhooks ni credenciales en el README.
|
|
* No publicar capturas que expongan API keys.
|
|
* Las credenciales deben vivir en n8n Credentials o vault interno GLM.
|
|
* El repo de Gitea debe servir como backup del workflow y documentación, no como almacén de secretos.
|
|
|
|
---
|
|
|
|
## CONFIGURACIÓN Y SETUP
|
|
|
|
### Prerrequisitos
|
|
|
|
* Acceso a n8n en el entorno GLM.
|
|
* Acceso a Evolution API.
|
|
* Instancia WhatsApp configurada.
|
|
* Grupo oficial de WhatsApp creado.
|
|
* Webhook de Evolution apuntando al workflow.
|
|
* Acceso a Google Sheets.
|
|
* Acceso a Google Drive.
|
|
* Acceso a Google Slides API.
|
|
* Credencial Gemini configurada.
|
|
* Credencial Redis configurada.
|
|
* Acceso al Banco de Propuestas de Fulgencio.
|
|
* Acceso al repositorio Gitea `chat-de-whatsapp-propuestas-ejecutadas`.
|
|
|
|
### Credenciales / variables
|
|
|
|
| Credencial / Variable | Descripción | Dónde se obtiene |
|
|
| ------------------------------ | --------------------------------------------------------- | --------------------- |
|
|
| N8N_WEBHOOK_PATH | Path del webhook de entrada | n8n |
|
|
| GOOGLE_SHEETS_OAUTH | Permite leer y escribir registros | n8n Credentials |
|
|
| GOOGLE_DRIVE_OAUTH | Permite crear carpetas, mover archivos y copiar plantilla | n8n Credentials |
|
|
| GOOGLE_SLIDES_OAUTH | Permite modificar presentación generada | n8n Credentials |
|
|
| GEMINI_API | Permite analizar multimedia y generar JSON final | n8n Credentials |
|
|
| REDIS_CREDENTIAL | Permite conteo y locks de análisis | n8n Credentials |
|
|
| SHEET_PROPUESTAS_EJECUTADAS_ID | ID del Sheet Fulgencio - Propuestas Ejecutadas | Google Sheets |
|
|
| BANCO_PROPUESTAS_SHEET_ID | ID del banco original de propuestas | Google Sheets |
|
|
| DRIVE_FOLDER_EJECUTADAS_ID | Carpeta base de propuestas ejecutadas | Google Drive |
|
|
| SLIDES_TEMPLATE_ID | Plantilla de presentación | Google Slides |
|
|
|
|
> Nunca commitear credenciales al repo. Todas las keys, tokens, URLs sensibles y webhooks deben mantenerse en n8n Credentials, variables seguras o vault interno GLM.
|
|
|
|
|
|
### Instalación / Deploy
|
|
|
|
```bash id="fkmkf4"
|
|
git clone https://git.digitalcompass.agency/Isaac_Aracena/chat-de-whatsapp-propuestas-ejecutadas.git
|
|
|
|
# En n8n:
|
|
# 1. Abrir n8n.
|
|
# 2. Importar el JSON del workflow.
|
|
# 3. Validar credenciales de Google Sheets.
|
|
# 4. Validar credenciales de Google Drive.
|
|
# 5. Validar credenciales de Google Slides.
|
|
# 6. Validar credencial de Gemini.
|
|
# 7. Validar credencial Redis.
|
|
# 8. Validar Evolution API URL e instancia.
|
|
# 9. Validar webhook de entrada.
|
|
# 10. Validar grupo permitido.
|
|
# 11. Ejecutar prueba end-to-end desde WhatsApp.
|
|
# 12. Revisar n8n Executions.
|
|
# 13. Activar el workflow.
|
|
```
|
|
|
|
---
|
|
|
|
## CÓMO FUNCIONA
|
|
|
|
### Flujo paso a paso
|
|
|
|
1. **Webhook - Evolution WhatsApp**
|
|
|
|
* Recibe mensajes desde WhatsApp.
|
|
|
|
2. **Code - Normalizar evento WhatsApp**
|
|
|
|
* Normaliza el evento.
|
|
* Detecta si viene de grupo.
|
|
* Identifica usuario real.
|
|
* Detecta texto, comandos, audio, imagen, video o documento.
|
|
* Define `whatsapp_to`, `sender_phone`, `group_jid` e idioma base.
|
|
|
|
3. **Filtro origen WhatsApp**
|
|
|
|
* Valida que el mensaje venga del origen permitido.
|
|
* Bloquea o ignora mensajes no autorizados.
|
|
|
|
4. **Sheets - Leer sesiones existentes**
|
|
|
|
* Lee sesiones activas en `wa_ejecuciones_sesiones`.
|
|
|
|
5. **Code - Resolver sesión WhatsApp**
|
|
|
|
* Decide si debe crear sesión, continuar, cancelar o avisar sesión activa.
|
|
|
|
6. **Switch - Decisión sesión WhatsApp**
|
|
|
|
* Enruta según la decisión:
|
|
|
|
* Crear sesión.
|
|
* Avisar sesión activa.
|
|
* Cancelar sesión.
|
|
* Continuar sesión.
|
|
* Sin sesión activa.
|
|
|
|
7. **Crear sesión**
|
|
|
|
* Guarda una nueva sesión en Sheets.
|
|
* Envía bienvenida y pide nota de voz.
|
|
|
|
8. **Continuar sesión**
|
|
|
|
* Lee etapa activa.
|
|
* Resuelve qué debe hacer según mensaje recibido.
|
|
|
|
9. **Paso 1 — Audio**
|
|
|
|
* Si recibe audio, lo guarda como evento.
|
|
* Actualiza sesión a espera de imágenes.
|
|
* Pide imágenes al usuario.
|
|
|
|
10. **Paso 2 — Imágenes**
|
|
|
|
* Guarda una o varias imágenes.
|
|
* Soporta lote de imágenes.
|
|
* Cuando el usuario escribe `FOTOS LISTAS`, valida que existan imágenes.
|
|
* Pasa a videos opcionales.
|
|
|
|
11. **Paso 3 — Videos**
|
|
|
|
* Recibe videos opcionales uno por uno.
|
|
* Si no hay videos, usuario escribe `SIN VIDEO`.
|
|
* Si sí hubo videos, usuario escribe `LISTO`.
|
|
* Pasa a procesamiento.
|
|
|
|
12. **Aviso procesando**
|
|
|
|
* Envía mensaje de “Reporte recibido” y notifica que se analizarán evidencias.
|
|
|
|
13. **Recuperación de media**
|
|
|
|
* Busca eventos multimedia de la sesión.
|
|
* Recupera archivos desde Evolution.
|
|
* Convierte media a binario.
|
|
* Sube evidencias a Google Drive.
|
|
* Guarda metadata en Sheets.
|
|
|
|
14. **Análisis Gemini por media**
|
|
|
|
* Analiza audio.
|
|
* Analiza imágenes.
|
|
* Analiza videos si existen.
|
|
* Guarda cada análisis en `wa_ejecuciones_analisis_media`.
|
|
|
|
15. **Control Redis**
|
|
|
|
* Cuenta cuántos análisis terminaron.
|
|
* Usa lock para evitar que el cierre final corra varias veces.
|
|
* Si falta análisis, espera y reintenta verificación.
|
|
|
|
16. **Consolidar análisis**
|
|
|
|
* Lee análisis guardados.
|
|
* Consolida audio, imágenes y videos.
|
|
* Construye prompt final.
|
|
|
|
17. **Gemini - JSON final**
|
|
|
|
* Genera un JSON estructurado del reporte.
|
|
|
|
18. **Normalizar JSON final**
|
|
|
|
* Limpia y estandariza campos.
|
|
* Clasifica el reporte.
|
|
* Prepara datos para match y guardado.
|
|
|
|
19. **Match contra Banco de Propuestas**
|
|
|
|
* Lee banco original.
|
|
* Busca coincidencias.
|
|
* Determina estado y confianza del match.
|
|
|
|
20. **Verificar duplicado**
|
|
|
|
* Revisa si la ejecución ya existe.
|
|
* Evita duplicar registros finales.
|
|
|
|
21. **Guardar propuesta ejecutada**
|
|
|
|
* Guarda el reporte final en `propuestas_ejecutadas`.
|
|
|
|
22. **Crear carpeta y presentación**
|
|
|
|
* Crea/copia presentación desde plantilla.
|
|
* Mueve evidencias a carpeta de ejecución.
|
|
* Reemplaza textos en Google Slides.
|
|
* Inserta imágenes.
|
|
* Limpia slides de fotos vacías cuando aplica.
|
|
|
|
23. **Actualizar links**
|
|
|
|
* Actualiza link de presentación en el Sheet.
|
|
* Si match es alto, actualiza el banco original con el link de propuesta ejecutada.
|
|
|
|
24. **Cerrar sesión**
|
|
|
|
* Actualiza sesión como completada.
|
|
* Envía mensaje final por WhatsApp con link de presentación.
|
|
|
|
---
|
|
|
|
## TRIGGERS
|
|
|
|
| Trigger | Frecuencia | Descripción |
|
|
| ----------------------- | ------------ | ----------------------------------------------------------- |
|
|
| Webhook POST `/factura` | On demand | Se dispara cuando Evolution API envía un evento de WhatsApp |
|
|
| Ejecución manual | Bajo demanda | Permite pruebas desde n8n con eventos fijados |
|
|
|
|
---
|
|
|
|
## COMANDOS OFICIALES
|
|
|
|
| Comando | Descripción |
|
|
| -------------- | -------------------------------------------------- |
|
|
| `Hey` | Inicia un nuevo reporte |
|
|
| `FOTOS LISTAS` | Confirma que el usuario terminó de enviar imágenes |
|
|
| `SIN VIDEO` | Cierra el reporte sin videos |
|
|
| `LISTO` | Cierra el reporte después de enviar videos |
|
|
| `CANCELAR` | Cancela el reporte actual |
|
|
|
|
---
|
|
|
|
## OUTPUTS
|
|
|
|
### Respuesta por WhatsApp
|
|
|
|
El usuario recibe mensajes como:
|
|
|
|
* Bienvenida y solicitud de nota de voz.
|
|
* Solicitud de imágenes.
|
|
* Solicitud de videos opcionales.
|
|
* Aviso de procesamiento.
|
|
* Link final de presentación.
|
|
* Mensajes de error controlado o instrucciones.
|
|
|
|
### Registro en Google Sheets
|
|
|
|
El flujo registra información en:
|
|
|
|
| Hoja | Uso |
|
|
| ------------------------------- | ------------------------------------- |
|
|
| `wa_ejecuciones_sesiones` | Estado de sesiones |
|
|
| `wa_ejecuciones_eventos` | Eventos recibidos |
|
|
| `wa_ejecuciones_media` | Metadata de media |
|
|
| `wa_ejecuciones_analisis_media` | Análisis de Gemini por archivo |
|
|
| `propuestas_ejecutadas` | Registro final de ejecución o externa |
|
|
|
|
### Presentación final
|
|
|
|
El flujo genera una presentación con:
|
|
|
|
* Título del reporte.
|
|
* Resumen IA.
|
|
* Datos de cliente, marca, país y ubicación.
|
|
* Relación con propuesta original si existe.
|
|
* Imágenes de evidencia.
|
|
* Link final compartido por WhatsApp.
|
|
|
|
### Banco original
|
|
|
|
Si hay match alto:
|
|
|
|
* Se actualiza la columna de enlaces a propuestas ejecutadas.
|
|
* Se evita duplicar links existentes.
|
|
|
|
Si no hay match alto:
|
|
|
|
* No se modifica el banco original.
|
|
|
|
---
|
|
|
|
## TESTING
|
|
|
|
### Casos de prueba mínimos
|
|
|
|
| Caso | Input | Output esperado | Estado |
|
|
| ---------------------------------- | -------------------------------------------- | ------------------------------------------- | ----------- |
|
|
| Inicio correcto | Usuario en grupo escribe `Hey` | Crea sesión y pide nota de voz | A completar |
|
|
| Sesión duplicada | Usuario escribe `Hey` con sesión activa | Avisa que ya existe sesión activa | A completar |
|
|
| Audio válido | Usuario envía nota de voz | Guarda audio y pide imágenes | A completar |
|
|
| Texto en vez de audio | Usuario envía texto en etapa audio | Pide nota de voz obligatoria | A completar |
|
|
| Una imagen | Usuario envía una imagen | Guarda imagen y permite seguir | A completar |
|
|
| Varias imágenes juntas | Usuario envía lote de imágenes | Guarda todas y confirma recepción | A completar |
|
|
| FOTOS LISTAS sin imágenes | Usuario escribe comando sin imágenes | Pide imágenes obligatorias | A completar |
|
|
| SIN VIDEO | Usuario cierra sin videos | Procesa reporte completo | A completar |
|
|
| Un video | Usuario envía video y luego `LISTO` | Procesa reporte con video | A completar |
|
|
| Varios videos uno por uno | Usuario envía varios videos separados | Guarda todos y procesa al cerrar | A completar |
|
|
| CANCELAR | Usuario cancela sesión | Sesión queda cancelada | A completar |
|
|
| Grupo no permitido | Mensaje desde grupo no autorizado | No procesa el flujo | A completar |
|
|
| Propuesta ejecutada con match alto | Reporte coincide con banco | Guarda ejecución y actualiza banco original | A completar |
|
|
| Match bajo/manual | Reporte no coincide con confianza suficiente | Guarda ejecución y no actualiza banco | A completar |
|
|
| Propuesta externa | Reporte indica externa | Guarda como externa y no actualiza banco | A completar |
|
|
| Duplicado de link | Banco ya tiene link ejecutado | No duplica link | A completar |
|
|
| Menos imágenes que placeholders | Reporte con pocas imágenes | Presentación sin slides vacíos visibles | A completar |
|
|
|
|
### Checklist de prueba rápida
|
|
|
|
* [ ] El webhook recibe eventos de WhatsApp.
|
|
* [ ] El filtro de grupo permitido funciona.
|
|
* [ ] `Hey` crea sesión.
|
|
* [ ] La nota de voz es obligatoria.
|
|
* [ ] Las imágenes son obligatorias.
|
|
* [ ] Las imágenes múltiples funcionan.
|
|
* [ ] Los videos opcionales funcionan uno por uno.
|
|
* [ ] `SIN VIDEO` cierra correctamente.
|
|
* [ ] `LISTO` cierra correctamente con videos.
|
|
* [ ] El aviso de procesamiento se envía.
|
|
* [ ] Gemini analiza audio, imagen y video.
|
|
* [ ] Redis evita cierres duplicados.
|
|
* [ ] Se guarda registro final.
|
|
* [ ] Se crea presentación.
|
|
* [ ] Se limpia presentación si hay placeholders vacíos.
|
|
* [ ] Se envía link final.
|
|
* [ ] El banco original solo se actualiza con match alto.
|
|
* [ ] n8n Executions queda en verde.
|
|
* [ ] Workflow exportado y commiteado en Gitea.
|
|
|
|
---
|
|
|
|
## ERRORES CONOCIDOS Y TROUBLESHOOTING
|
|
|
|
| Error | Causa probable | Solución |
|
|
| ----------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------- |
|
|
| Bot no responde | Webhook no recibe evento o workflow desactivado | Revisar Evolution webhook y n8n Executions |
|
|
| Mensaje va al usuario y no al grupo | `whatsapp_to` mal resuelto | Revisar `group_jid`, `remoteJid` y normalización de evento |
|
|
| Usuario equivocado en grupo | Se usó `participant` en vez de `participantAlt` | Validar sender real en evento Evolution |
|
|
| Sesión no aparece | Error leyendo o escribiendo `wa_ejecuciones_sesiones` | Revisar credencial Google Sheets |
|
|
| Pide audio aunque ya se envió | Audio no se registró como `message_type = audio` | Revisar normalización de media |
|
|
| Imágenes no se guardan | Evolution envió álbum/lote con estructura distinta | Revisar separación de media en items |
|
|
| Videos fallan en Gemini | Binario no llega como `data` o mime type incorrecto | Revisar preparación Gemini video |
|
|
| Prompt final vacío | No se consolidaron análisis media | Revisar `wa_ejecuciones_analisis_media` y sesión filtrada |
|
|
| Procesamiento se queda esperando | Falta análisis o Redis no detecta conteo completo | Revisar contador Redis y rows de análisis |
|
|
| Doble cierre | Lock Redis no se adquirió correctamente | Revisar `Redis - Lock análisis final` |
|
|
| No crea presentación | Error en Drive o plantilla | Revisar credencial Drive y template |
|
|
| Slides vacíos | No se eliminaron placeholders no usados | Revisar payload de limpieza de Slides |
|
|
| No actualiza banco | Match bajo o condición de alta confianza no cumplida | Revisar estado de match |
|
|
| Duplica link | Validación de link existente falló | Revisar lógica de actualización de banco |
|
|
| Error 401/403 Google | Credencial sin permiso | Renovar o compartir recurso con cuenta OAuth |
|
|
| Error Evolution 401 | API key inválida | Rotar key en n8n Credentials / variables seguras |
|
|
|
|
---
|
|
|
|
## MONITOREO
|
|
|
|
* Revisar n8n Executions después de pruebas o cambios.
|
|
* Verde = ejecución correcta.
|
|
* Rojo = revisar el nodo exacto del fallo.
|
|
* Revisar que el grupo oficial siga autorizado.
|
|
* Revisar que Evolution API esté activo.
|
|
* Revisar que Google Sheets no cambie encabezados.
|
|
* Revisar que Drive y Slides mantengan permisos.
|
|
* Revisar que Redis esté disponible.
|
|
* Revisar periódicamente propuestas con revisión manual.
|
|
* Confirmar que las presentaciones generadas abran correctamente.
|
|
* Mantener backup del workflow actualizado en Gitea.
|
|
|
|
### Output esperado normal
|
|
|
|
El flujo debe:
|
|
|
|
* Recibir evento de WhatsApp.
|
|
* Crear o continuar sesión.
|
|
* Solicitar audio, imágenes y videos.
|
|
* Procesar evidencias.
|
|
* Analizar con IA.
|
|
* Generar registro final.
|
|
* Crear presentación.
|
|
* Actualizar links cuando corresponda.
|
|
* Responder por WhatsApp.
|
|
* Terminar sin errores.
|
|
|
|
---
|
|
|
|
## ESTRUCTURA DEL REPOSITORIO
|
|
|
|
```txt id="y2xjdy"
|
|
/chat-de-whatsapp-propuestas-ejecutadas
|
|
|-- README.md
|
|
|-- chat-de-whatsapp-propuestas-ejecutadas.json
|
|
|-- /docs
|
|
| └-- [capturas o documentación adicional si aplica]
|
|
|-- CHANGELOG.md
|
|
└-- DECISIONS.md
|
|
```
|
|
|
|
> Si el repo solo contiene `README.md` y el JSON del workflow, mantener esta estructura simple. Si el proyecto crece, agregar `/docs`, `CHANGELOG.md` y `DECISIONS.md`.
|
|
|
|
---
|
|
|
|
## CHANGELOG
|
|
|
|
### 2026-06 — v2.0 / Versión Final
|
|
|
|
* Flujo final de WhatsApp para propuestas ejecutadas y externas.
|
|
* Soporte de grupo oficial de WhatsApp.
|
|
* Identificación correcta de usuario real en grupo.
|
|
* Control de sesiones por usuario/grupo.
|
|
* Nota de voz obligatoria.
|
|
* Imágenes obligatorias.
|
|
* Soporte de múltiples imágenes.
|
|
* Videos opcionales uno por uno.
|
|
* Análisis de audio, imagen y video con Gemini.
|
|
* Control Redis para conteo de análisis y cierre final.
|
|
* Generación automática de presentación.
|
|
* Limpieza de slides vacíos.
|
|
* Registro final en `propuestas_ejecutadas`.
|
|
* Match contra banco original.
|
|
* Actualización del banco con link ejecutado solo en match alto.
|
|
* Prevención de duplicados.
|
|
* Respuesta final por WhatsApp.
|
|
* Backup del workflow en Gitea.
|
|
* Documentación inicial del README.
|
|
|
|
---
|
|
|
|
## DECISIONS LOG
|
|
|
|
### DEC-001 — Usar WhatsApp como canal operativo
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** Los equipos operativos reportan evidencias desde campo.
|
|
* **Opciones consideradas:** App web, Google Chat, WhatsApp.
|
|
* **Decisión:** Usar WhatsApp.
|
|
* **Razón:** Es el canal más natural para enviar audios, fotos y videos desde campo.
|
|
|
|
### DEC-002 — Controlar acceso por grupo oficial
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** El flujo debía ser fácil de operar sin una tabla manual de usuarios.
|
|
* **Opciones consideradas:** Lista de teléfonos vs pertenencia al grupo.
|
|
* **Decisión:** Permitir uso desde grupo oficial autorizado.
|
|
* **Razón:** Simplifica operación: agregar usuario al grupo equivale a darle acceso.
|
|
|
|
### DEC-003 — Nota de voz obligatoria
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** Las imágenes por sí solas no explican completamente la ejecución.
|
|
* **Decisión:** Requerir nota de voz.
|
|
* **Razón:** Aporta contexto de marca, país, ubicación, referencia y tipo de reporte.
|
|
|
|
### DEC-004 — Imágenes obligatorias y videos opcionales
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** Toda ejecución necesita evidencia visual, pero no siempre hay video.
|
|
* **Decisión:** Imágenes obligatorias; videos opcionales.
|
|
* **Razón:** Mantiene evidencia mínima sin frenar reportes cuando no hay video.
|
|
|
|
### DEC-005 — Permitir varias imágenes, pero videos uno por uno
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** WhatsApp permite enviar varias imágenes juntas; los videos pueden ser más pesados y menos consistentes.
|
|
* **Decisión:** Soportar múltiples imágenes y pedir videos separados.
|
|
* **Razón:** Mejora experiencia sin arriesgar estabilidad del flujo.
|
|
|
|
### DEC-006 — Usar Redis para control de cierre
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** El análisis multimedia puede terminar en paralelo y provocar cierres duplicados.
|
|
* **Decisión:** Usar contador y lock en Redis.
|
|
* **Razón:** Evita duplicar análisis final, registros o presentaciones.
|
|
|
|
### DEC-007 — Actualizar banco original solo con match alto
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** No se debe vincular una ejecución a una propuesta original sin confianza suficiente.
|
|
* **Decisión:** Actualizar banco solo cuando el match sea confiable.
|
|
* **Razón:** Protege la calidad del banco y evita relaciones incorrectas.
|
|
|
|
### DEC-008 — Registrar propuestas externas sin actualizar banco original
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** Algunas evidencias pueden pertenecer a propuestas externas o no existentes en el banco.
|
|
* **Decisión:** Guardarlas en `propuestas_ejecutadas` sin modificar el banco.
|
|
* **Razón:** Mantiene trazabilidad sin contaminar la fuente original.
|
|
|
|
### DEC-009 — Generar presentación automática
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** El equipo necesita un entregable ordenado, no solo archivos sueltos.
|
|
* **Decisión:** Crear presentación desde template.
|
|
* **Razón:** Estandariza el reporte y facilita consulta posterior.
|
|
|
|
### DEC-010 — No guardar credenciales en Gitea
|
|
|
|
* **Fecha:** 2026-06
|
|
* **Contexto:** El workflow usa APIs y webhooks sensibles.
|
|
* **Decisión:** Mantener credenciales fuera del repositorio.
|
|
* **Razón:** Evita exposición de secretos y mantiene buenas prácticas de seguridad.
|
|
|
|
---
|
|
|
|
## CONTACTOS DEL PROYECTO
|
|
|
|
| Rol | Nombre |
|
|
| ------------- | ------------- |
|
|
| Product Owner | Máximo Gómez |
|
|
| IT Manager | Luis Matos |
|
|
| Developer | Isaac Aracena |
|
|
|
|
---
|
|
|
|
## DEFINITION OF DONE
|
|
|
|
* [ ] Workflow activo en n8n.
|
|
* [ ] Webhook de Evolution validado.
|
|
* [ ] Grupo oficial autorizado validado.
|
|
* [ ] Inicio con `Hey` validado.
|
|
* [ ] Nota de voz obligatoria validada.
|
|
* [ ] Imágenes obligatorias validadas.
|
|
* [ ] Múltiples imágenes validadas.
|
|
* [ ] Videos opcionales validados.
|
|
* [ ] `SIN VIDEO` validado.
|
|
* [ ] `LISTO` validado.
|
|
* [ ] `CANCELAR` validado.
|
|
* [ ] Gemini analiza audio correctamente.
|
|
* [ ] Gemini analiza imágenes correctamente.
|
|
* [ ] Gemini analiza videos correctamente si existen.
|
|
* [ ] Redis controla conteo y lock de cierre.
|
|
* [ ] Registro final en Sheets validado.
|
|
* [ ] Presentación generada correctamente.
|
|
* [ ] Slides vacíos limpiados o eliminados.
|
|
* [ ] Banco original actualiza solo con match alto.
|
|
* [ ] Propuesta externa no actualiza banco original.
|
|
* [ ] Duplicado de link prevenido.
|
|
* [ ] Mensaje final por WhatsApp validado.
|
|
* [ ] n8n Executions sin errores.
|
|
* [ ] Workflow exportado y subido a Gitea.
|
|
* [ ] README completo y actualizado.
|
|
* [ ] Link del repo agregado al Kan.bn de CDC Fulgencio V2.0.
|
|
* [ ] Validado por IT.
|
|
* [ ] Validado por responsable del proceso si aplica.
|
|
|
|
---
|
|
|
|
## NOTAS OPERATIVAS
|
|
|
|
* Este repositorio contiene el backup/documentación del workflow n8n.
|
|
* No debe contener credenciales, API keys, tokens ni webhooks sensibles.
|
|
* Si cambia el grupo oficial, actualizar el filtro de origen.
|
|
* Si cambia Evolution API, revisar URL, instancia y credenciales.
|
|
* Si cambian los encabezados del Sheet, actualizar nodos de mapeo.
|
|
* Si cambia la plantilla de Slides, validar placeholders y limpieza de slides.
|
|
* Si cambia el banco original, revisar lógica de match y actualización.
|
|
* Si se agregan más países, idiomas o reglas, actualizar normalización.
|
|
* Si se cambia la lógica de Gemini, documentar en CHANGELOG.
|
|
* Si se rota la API key de Evolution, actualizar únicamente n8n/vault.
|
|
|
|
--- |