From 091878d48412c35dfb64675014ae62124f4900cf Mon Sep 17 00:00:00 2001 From: Eric Date: Fri, 21 Aug 2026 10:50:13 -0300 Subject: [PATCH] fix(n8n): so processa mensagens quando o ticket esta no fluxo de Orcamento O Webhook do Canal dispara pra toda mensagem do numero, entao o bot estava respondendo (pedindo exames) pra qualquer coisa -- CPF, agendamento, resultado de exame etc. Filtra por ticket.stepChatFlow, so seguindo quando o ticket esta parado no passo Menu Orcamento ou Menu Orcamento 2; qualquer outra coisa e ignorada sem resposta. Co-Authored-By: Claude Sonnet 5 --- ...26-08-20-orcamento-exames-imagem-design.md | 26 ++++++ n8n/orcamento-exames-imagem.workflow.json | 83 ++++++++++++++++++- 2 files changed, 106 insertions(+), 3 deletions(-) diff --git a/docs/superpowers/specs/2026-08-20-orcamento-exames-imagem-design.md b/docs/superpowers/specs/2026-08-20-orcamento-exames-imagem-design.md index 9ca344f..0cfcd09 100644 --- a/docs/superpowers/specs/2026-08-20-orcamento-exames-imagem-design.md +++ b/docs/superpowers/specs/2026-08-20-orcamento-exames-imagem-design.md @@ -357,6 +357,29 @@ ApiID e token dedicados a este projeto. Correção aplicada: - Isso mantém este projeto completamente independente do de agendamento — nenhum node ou credencial é compartilhado entre os dois. +### Descoberta 7: filtro por fluxo/fila (o bot respondia a qualquer mensagem) + +Como o "Webhook do Canal" dispara pra **toda mensagem do número** (não só +pra quem está no menu de Orçamento), o bot estava respondendo pra qualquer +coisa — cliente mandando foto do CPF, pedindo agendamento, etc. — sempre +pedindo exames. Isso não reflete o atendimento real: o cliente manda +mensagem, recebe o menu de filas, escolhe "Orçamento", e só a partir daí a +automação deve agir. + +Correção: o payload do webhook traz `ticket.stepChatFlow`, identificando em +qual passo do ChatFlow o ticket está parado. Os passos `Menu Orçamento` e +`Menu Orçamento 2` (os únicos dois pontos do ChatFlow que levam a essa +automação) têm ids fixos: `node-1787312722889` e `node-1787312980617`. +Adicionado o node **"Está no fluxo de Orçamento?"**, logo após extrair os +campos: só segue adiante (pro resto do pipeline) se `stepChatFlow` for um +desses dois; qualquer outra coisa cai num `NoOp` e é ignorada — sem +resposta nenhuma, deixando pra fila/fluxo correspondente cuidar. + +**Risco conhecido:** esse filtro depende dos ids de step atuais do +ChatFlow. Se o `Menu Orçamento`/`Menu Orçamento 2` forem recriados (não só +editados) no editor do Z-PRO, os ids mudam e o filtro precisa ser +atualizado no node `Está no fluxo de Orçamento?`. + ### Ainda em aberto - Remover as interações antigas "Webhook Avançado"/"Mensagem" dos passos @@ -364,6 +387,9 @@ ApiID e token dedicados a este projeto. Correção aplicada: antigo, que não existe mais no n8n — não causam mais duplicidade, mas ficam como chamada morta até serem removidas). - Confirmar que o número de envio agora bate com o número que recebe. +- Validar que o filtro por `stepChatFlow` realmente bloqueia mensagens fora + do fluxo de Orçamento (CPF, agendamento, resultado de exame etc.) e não + bloqueia as de dentro. - Trocar a tabela de exames de exemplo pela lista real, direto no `system message` do node `AI Agent - Orçamento`. diff --git a/n8n/orcamento-exames-imagem.workflow.json b/n8n/orcamento-exames-imagem.workflow.json index 81b18eb..93821b5 100644 --- a/n8n/orcamento-exames-imagem.workflow.json +++ b/n8n/orcamento-exames-imagem.workflow.json @@ -66,6 +66,12 @@ "name": "mediaToken", "type": "string", "value": "={{ ($json.body.ticket.whatsapp && $json.body.ticket.whatsapp.bmToken) || '' }}" + }, + { + "id": "campo-stepchatflow", + "name": "stepChatFlow", + "type": "string", + "value": "={{ $json.body.ticket.stepChatFlow || '' }}" } ] }, @@ -80,6 +86,59 @@ 0 ] }, + { + "id": "if-esta-em-orcamento", + "name": "Está no fluxo de Orçamento?", + "type": "n8n-nodes-base.if", + "typeVersion": 2.3, + "position": [ + -240, + 0 + ], + "parameters": { + "conditions": { + "options": { + "version": 2, + "leftValue": "", + "caseSensitive": true, + "typeValidation": "strict" + }, + "combinator": "or", + "conditions": [ + { + "id": "cond-step-menu-orcamento-1", + "leftValue": "={{ $json.stepChatFlow }}", + "rightValue": "node-1787312722889", + "operator": { + "type": "string", + "operation": "equals" + } + }, + { + "id": "cond-step-menu-orcamento-2", + "leftValue": "={{ $json.stepChatFlow }}", + "rightValue": "node-1787312980617", + "operator": { + "type": "string", + "operation": "equals" + } + } + ] + }, + "options": {} + } + }, + { + "id": "noop-fora-orcamento", + "name": "Não é fluxo de Orçamento - ignora", + "type": "n8n-nodes-base.noOp", + "typeVersion": 1, + "position": [ + -240, + 200 + ], + "parameters": {} + }, { "parameters": { "conditions": { @@ -357,7 +416,18 @@ "main": [ [ { - "node": "É mensagem de imagem?", + "node": "Está no fluxo de Orçamento?", + "type": "main", + "index": 0 + } + ] + ] + }, + "Montar corpo da resposta": { + "main": [ + [ + { + "node": "Enviar orçamento (Z-PRO)", "type": "main", "index": 0 } @@ -375,11 +445,18 @@ ] ] }, - "Montar corpo da resposta": { + "Está no fluxo de Orçamento?": { "main": [ [ { - "node": "Enviar orçamento (Z-PRO)", + "node": "É mensagem de imagem?", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "Não é fluxo de Orçamento - ignora", "type": "main", "index": 0 }