Update backup: Chat de WhatsApp - Propuestas Ejecutadas - Versión Final

This commit is contained in:
2026-07-19 04:00:57 +00:00
parent a692795cd4
commit 66476a86ba
@@ -1,9 +1,9 @@
{
"updatedAt": "2026-07-04T22:33:50.467Z",
"updatedAt": "2026-07-16T16:14:30.458Z",
"createdAt": "2026-06-24T14:10:15.435Z",
"id": "CdosDIWBgnDMnPdr",
"name": "Chat de WhatsApp - Propuestas Ejecutadas - Versión Final",
"description": null,
"description": "Gestiona por WhatsApp la recepción de propuestas ejecutadas o externas, procesa notas de voz, imágenes y videos, organiza los archivos y genera automáticamente la presentación correspondiente.",
"active": true,
"isArchived": false,
"nodes": [
@@ -42,8 +42,8 @@
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
15680,
1632
15344,
1648
],
"id": "dad797ac-f70a-4550-a1bb-297d2f296dc4",
"name": "WhatsApp - Enviar mensaje TEST"
@@ -8355,7 +8355,7 @@
{
"parameters": {
"content": "## 🧾 CONTROL DE SESIONES\n\nEste bloque controla si el usuario puede iniciar, continuar o cancelar un reporte.\n\nDecisiones:\n- CREAR_SESION: inicia nuevo reporte con Hey.\n- AVISO_SESION_ACTIVA: ya existe una sesión abierta.\n- CONTINUAR_SESION: sigue el reporte actual.\n- CANCELAR_SESION: cancela sesión activa.\n- SIN_SESION_ACTIVA: no hay reporte abierto.\n- SIN_SESION_PARA_CANCELAR: intento de cancelar sin sesión.\n\nRegla:\nuna propuesta/reporte activo por usuario dentro del grupo.",
"height": 672,
"height": 624,
"width": 1024,
"color": 4
},
@@ -8387,7 +8387,7 @@
{
"parameters": {
"content": "## 🧭 ROUTER DEL REPORTE ACTIVO\n\nEste bloque decide qué hacer según la etapa actual de la sesión.\n\nEtapas:\n- ESPERANDO_AUDIO\n- ESPERANDO_IMAGENES\n- ESPERANDO_VIDEOS\n- PROCESANDO\n\nDecisiones principales:\n- Guardar audio\n- Pedir audio\n- Guardar imágenes\n- Validar FOTOS LISTAS\n- Guardar videos\n- Cerrar sin video\n- Cerrar con videos\n- Avisar procesamiento\n- Ignorar eventos no válidos\n\nRegla:\ncada mensaje se procesa según la etapa activa, no de forma aislada.",
"height": 944,
"height": 896,
"width": 1024,
"color": 2
},
@@ -8404,13 +8404,13 @@
"parameters": {
"content": "## 🎙️ PASO 1 — AUDIO OBLIGATORIO\n\nEl reporte no avanza sin nota de voz.\n\nCuando llega un audio:\n- Se guarda el evento en wa_ejecuciones_eventos.\n- Se actualiza la sesión.\n- Se incrementa audio_count.\n- La etapa cambia a ESPERANDO_IMAGENES.\n- El bot pide las imágenes obligatorias.\n\nLa nota de voz debe explicar:\n- Propuesta o referencia\n- Marca/cliente\n- País\n- Ubicación\n- Qué se ejecutó o reportó\n- Comentarios o resultados",
"height": 640,
"width": 2448,
"width": 2064,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-5952,
-5568,
-2800
],
"id": "cf2e46cc-9bb7-469c-9335-a578a24fc23e",
@@ -8468,13 +8468,13 @@
"parameters": {
"content": "## 🤖 ANÁLISIS IA Y CONTROL REDIS\n\nGemini analiza cada evidencia multimedia:\n- Audio\n- Imágenes\n- Videos opcionales\n\nCada análisis se guarda en:\nwa_ejecuciones_analisis_media\n\nRedis controla el cierre:\n- Cuenta análisis completados.\n- Verifica si ya están todos listos.\n- Usa lock para evitar cierre duplicado.\n- Si faltan análisis, espera y reintenta.\n\nRegla:\nel JSON final solo se genera cuando el análisis multimedia está completo.",
"height": 1504,
"width": 6304,
"width": 5712,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-2112,
-1520,
1440
],
"id": "4400f1ea-39b9-4302-86b4-a0c463f8e76c",
@@ -8483,8 +8483,8 @@
{
"parameters": {
"content": "## ✅ CIERRE FINAL DEL REPORTE\n\nEste bloque genera el resultado final del reporte.\n\nProceso:\n1. Consolida análisis multimedia.\n2. Gemini genera JSON final estructurado.\n3. Se normaliza la respuesta.\n4. Se hace match contra el Banco de Propuestas.\n5. Se verifica duplicado.\n6. Se guarda en propuestas_ejecutadas.\n7. Se crea carpeta de ejecución en Drive.\n8. Se copia la plantilla de Slides.\n9. Se insertan imágenes y se borran slides vacíos.\n10. Se actualiza el link final.\n11. Si el match es alto, se actualiza el banco original.\n12. Se envía el link final por WhatsApp.\n\nRegla:\npropuestas externas o match bajo no actualizan el banco original.",
"height": 1216,
"width": 11408,
"height": 1024,
"width": 10848,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
@@ -8495,6 +8495,22 @@
],
"id": "a3245658-be74-4ea6-8a58-a104803896ac",
"name": "Sticky Note9"
},
{
"parameters": {
"content": "## Fotos Listas\n\nActualizar a Fotos listas y preparar solicitud de videos",
"height": 272,
"width": 944,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-3792,
-1264
],
"id": "0ce97fde-e030-4175-baa9-b804cdc18803",
"name": "Sticky Note10"
}
],
"connections": {
@@ -10081,15 +10097,15 @@
"settings": {
"executionOrder": "v1",
"binaryMode": "separate",
"availableInMCP": false
"availableInMCP": true
},
"staticData": null,
"meta": {
"templateCredsSetupCompleted": true
},
"versionId": "135d4b16-b87e-4b14-8234-57a60538586e",
"activeVersionId": "135d4b16-b87e-4b14-8234-57a60538586e",
"versionCounter": 218,
"versionId": "4d721462-7812-496f-9339-30107ebe2e83",
"activeVersionId": "4d721462-7812-496f-9339-30107ebe2e83",
"versionCounter": 249,
"triggerCount": 1,
"shared": [
{
@@ -10112,9 +10128,9 @@
],
"tags": [],
"activeVersion": {
"updatedAt": "2026-07-04T22:34:01.000Z",
"createdAt": "2026-07-04T22:33:50.475Z",
"versionId": "135d4b16-b87e-4b14-8234-57a60538586e",
"updatedAt": "2026-07-15T15:06:52.000Z",
"createdAt": "2026-07-15T15:06:50.616Z",
"versionId": "4d721462-7812-496f-9339-30107ebe2e83",
"workflowId": "CdosDIWBgnDMnPdr",
"nodes": [
{
@@ -10152,8 +10168,8 @@
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
15680,
1632
15344,
1648
],
"id": "dad797ac-f70a-4550-a1bb-297d2f296dc4",
"name": "WhatsApp - Enviar mensaje TEST"
@@ -18465,7 +18481,7 @@
{
"parameters": {
"content": "## 🧾 CONTROL DE SESIONES\n\nEste bloque controla si el usuario puede iniciar, continuar o cancelar un reporte.\n\nDecisiones:\n- CREAR_SESION: inicia nuevo reporte con Hey.\n- AVISO_SESION_ACTIVA: ya existe una sesión abierta.\n- CONTINUAR_SESION: sigue el reporte actual.\n- CANCELAR_SESION: cancela sesión activa.\n- SIN_SESION_ACTIVA: no hay reporte abierto.\n- SIN_SESION_PARA_CANCELAR: intento de cancelar sin sesión.\n\nRegla:\nuna propuesta/reporte activo por usuario dentro del grupo.",
"height": 672,
"height": 624,
"width": 1024,
"color": 4
},
@@ -18497,7 +18513,7 @@
{
"parameters": {
"content": "## 🧭 ROUTER DEL REPORTE ACTIVO\n\nEste bloque decide qué hacer según la etapa actual de la sesión.\n\nEtapas:\n- ESPERANDO_AUDIO\n- ESPERANDO_IMAGENES\n- ESPERANDO_VIDEOS\n- PROCESANDO\n\nDecisiones principales:\n- Guardar audio\n- Pedir audio\n- Guardar imágenes\n- Validar FOTOS LISTAS\n- Guardar videos\n- Cerrar sin video\n- Cerrar con videos\n- Avisar procesamiento\n- Ignorar eventos no válidos\n\nRegla:\ncada mensaje se procesa según la etapa activa, no de forma aislada.",
"height": 944,
"height": 896,
"width": 1024,
"color": 2
},
@@ -18514,13 +18530,13 @@
"parameters": {
"content": "## 🎙️ PASO 1 — AUDIO OBLIGATORIO\n\nEl reporte no avanza sin nota de voz.\n\nCuando llega un audio:\n- Se guarda el evento en wa_ejecuciones_eventos.\n- Se actualiza la sesión.\n- Se incrementa audio_count.\n- La etapa cambia a ESPERANDO_IMAGENES.\n- El bot pide las imágenes obligatorias.\n\nLa nota de voz debe explicar:\n- Propuesta o referencia\n- Marca/cliente\n- País\n- Ubicación\n- Qué se ejecutó o reportó\n- Comentarios o resultados",
"height": 640,
"width": 2448,
"width": 2064,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-5952,
-5568,
-2800
],
"id": "cf2e46cc-9bb7-469c-9335-a578a24fc23e",
@@ -18578,13 +18594,13 @@
"parameters": {
"content": "## 🤖 ANÁLISIS IA Y CONTROL REDIS\n\nGemini analiza cada evidencia multimedia:\n- Audio\n- Imágenes\n- Videos opcionales\n\nCada análisis se guarda en:\nwa_ejecuciones_analisis_media\n\nRedis controla el cierre:\n- Cuenta análisis completados.\n- Verifica si ya están todos listos.\n- Usa lock para evitar cierre duplicado.\n- Si faltan análisis, espera y reintenta.\n\nRegla:\nel JSON final solo se genera cuando el análisis multimedia está completo.",
"height": 1504,
"width": 6304,
"width": 5712,
"color": 3
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-2112,
-1520,
1440
],
"id": "4400f1ea-39b9-4302-86b4-a0c463f8e76c",
@@ -18593,8 +18609,8 @@
{
"parameters": {
"content": "## ✅ CIERRE FINAL DEL REPORTE\n\nEste bloque genera el resultado final del reporte.\n\nProceso:\n1. Consolida análisis multimedia.\n2. Gemini genera JSON final estructurado.\n3. Se normaliza la respuesta.\n4. Se hace match contra el Banco de Propuestas.\n5. Se verifica duplicado.\n6. Se guarda en propuestas_ejecutadas.\n7. Se crea carpeta de ejecución en Drive.\n8. Se copia la plantilla de Slides.\n9. Se insertan imágenes y se borran slides vacíos.\n10. Se actualiza el link final.\n11. Si el match es alto, se actualiza el banco original.\n12. Se envía el link final por WhatsApp.\n\nRegla:\npropuestas externas o match bajo no actualizan el banco original.",
"height": 1216,
"width": 11408,
"height": 1024,
"width": 10848,
"color": 6
},
"type": "n8n-nodes-base.stickyNote",
@@ -18605,6 +18621,22 @@
],
"id": "a3245658-be74-4ea6-8a58-a104803896ac",
"name": "Sticky Note9"
},
{
"parameters": {
"content": "## Fotos Listas\n\nActualizar a Fotos listas y preparar solicitud de videos",
"height": 272,
"width": 944,
"color": 4
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-3792,
-1264
],
"id": "0ce97fde-e030-4175-baa9-b804cdc18803",
"name": "Sticky Note10"
}
],
"connections": {
@@ -20189,15 +20221,15 @@
}
},
"authors": "Isaac Aracena",
"name": "Version 135d4b16",
"name": "Version 4d721462",
"description": "",
"autosaved": true,
"autosaved": false,
"workflowPublishHistory": [
{
"createdAt": "2026-07-04T22:34:01.172Z",
"id": 2460,
"createdAt": "2026-07-15T15:06:52.705Z",
"id": 2961,
"workflowId": "CdosDIWBgnDMnPdr",
"versionId": "135d4b16-b87e-4b14-8234-57a60538586e",
"versionId": "4d721462-7812-496f-9339-30107ebe2e83",
"event": "activated",
"userId": "0a88c0b1-928e-4412-896e-c5d1c99b2029"
}