Execução Condicional
Como fazer uma etapa executar (ou não) conforme uma condição, sem encerrar o processo. Direto no campo da própria etapa, sem depender de uma etapa de Decisão.
Conceito: skip vs. terminate
Quando uma etapa não deve ser executada em uma determinada situação, há duas abordagens:
| Abordagem | Quando usar |
|---|---|
| Skip (pular) | A etapa é opcional. O processo continua normalmente sem ela. Ex.: enviar e-mail somente se houver novos dados. |
| Terminate (encerrar) | A condição torna inviável continuar. Ex.: nenhum documento para processar, então o processo pode encerrar normalmente. Isso exige roteamento de verdade, veja Decisão. |
Esta página trata do caso de skip de uma única etapa. A forma direta, abaixo, é a recomendada; o roteamento via Decisão continua sendo o caminho para terminate() ou para pular vários passos de uma vez (veja mais adiante).
Executar esta Etapa somente se: a forma direta
Toda etapa, de qualquer tipo e Decisão incluída, tem, na seção Condições de Rotas e Execuções, um toggle Executar esta Etapa somente se. Ative-o e a etapa só roda quando a condição declarada em Condições para Execução for verdadeira; se for falsa, o runtime pula essa etapa e segue direto para a próxima, sem precisar de nenhuma etapa de Decisão separada antes dela.

O builder visual cobre a maioria dos casos: escolha a variável (do processo, da Matrix, de um conector), um operador (=, >, .length, etc.) e o valor de comparação. Para cenários mais complexos, com lógica que o builder visual não expressa, clique em ✎ Manual para escrever a condição como JavaScript livre, no mesmo formato usado nas condições de rota:
No campo Valor, digite o texto direto (aprovado) ou {variável}, sem aspas, inclusive misturando os dois (Ticket-{id}). O builder grava a sintaxe JavaScript certa por trás, aspas incluídas quando for texto. Isso vale só para o builder visual: no modo Manual, o script é JavaScript de verdade, e texto sem aspas quebra a etapa.

{matrix.area_responsavel} == "ADMIN" || {CNPJ_LIST}.length > 1). "Converter para visual" tenta voltar ao builder, quando a expressão permitir.No editor manual, digite { para abrir a lista de todas as variáveis do processo disponíveis naquele ponto do fluxo, sem precisar decorar nomes ou voltar para conferir em outra aba:

{ no editor manual lista as variáveis do processo disponíveis para inserir na condição.&& / ||, .length, etc. Tudo o que está documentado em Lógicas de Rota vale aqui também.
Como identificar uma etapa condicional no canvas
Uma etapa com Executar esta Etapa somente se ativado ganha um badge ⊘ no canto do card:

Passe o mouse sobre o badge para ver a condição sem precisar abrir a etapa:

A legenda completa de ícones e badges do canvas está em Agent Builder → Cards, badges e conexões.
Pulando um bloco inteiro de etapas
Executar esta Etapa somente se gate uma etapa por vez. Quando várias etapas consecutivas precisam ser puladas juntas, o caminho continua sendo uma etapa de Decisão antes do bloco, apontando direto para a primeira etapa depois dele:
[Decisão "Tem Arquivo?"]
Rota 1: {arquivo} is empty → Etapa Após Download (pula todas)
Rota 2: true → Baixar Arquivo
↓
[Baixar Arquivo]
↓
[Processar PDF]
↓
[Extrair Campos do PDF]
↓
[Etapa Após Download], sempre executa
Uma flag, ou seja, uma variável booleana ('sim'/'nao' ou 'true'/'false') que guarda se uma condição foi detectada em algum ponto anterior do processo, é útil tanto aqui quanto na condição direta, quando o cálculo da condição é complexo demais para uma expressão de uma linha:
const dados = bm.get('{dados}', []);
const temNovos = dados.some(d => d.status === 'novo');
bm.done('verificou', {
'{encontrou_novos}': temNovos ? 'sim' : 'nao',
'{qtd_novos}': dados.filter(d => d.status === 'novo').length
});
encontrou_novos do tipo Verdadeiro/Falso, com a Fórmula Number({qtd_novos}) > 0. O script acima continua sendo o caminho quando é preciso percorrer uma lista para decidir. Veja Manipulação de Variáveis → Locais.
A flag pode alimentar tanto uma condição de rota (para pular o bloco inteiro) quanto uma condição de execução direta (para pular só a etapa seguinte):
// Decisão, para pular o bloco inteiro:
Rota 1:
Condição: {encontrou_novos} == 'nao'
Ir para: Finalizar Processo ← pula o bloco de processamento
Rota 2:
Condição: true
Ir para: Processar Novos ← entra no bloco
// OU, na própria etapa "Processar Novos", direto:
Executar esta Etapa somente se: {encontrou_novos} == 'sim'
Exemplos práticos
Enviar e-mail somente se houve erros
Etapa única. A forma direta resolve sem precisar de uma Decisão separada:
// {falhas} contém a lista de itens que falharam, definida antes no processo
Executar esta Etapa somente se:
{falhas}.length > 0
Baixar anexo somente se o botão existe
Também é etapa única. A etapa de captura só verifica a presença do botão; quem decide se baixa é a própria etapa de download, via condição direta:
// Etapa "Verificar Botão de Download" (anterior): mapeamento captura o atributo
// exists do seletor .btn-download, salva em {tem_botao} = 'sim' ou ''
Executar esta Etapa somente se:
{tem_botao} == 'sim'
Processar API somente em dias úteis (ou encerrar)
Aqui a resposta certa não é skip, é terminate. Em dia não útil, o processo deve encerrar, não só pular uma etapa. Isso exige roteamento de verdade, então continua sendo uma etapa de Decisão:
// Etapa: Verificar Dia (Regra Customizada)
const dia = new Date().getDay(); // 0=dom, 6=sab
const ehUtil = dia >= 1 && dia <= 5;
bm.done('dia-verificado', {
'{dia_util}': ehUtil ? 'sim' : 'nao'
});
// Decisão "É Dia Útil?"
// Rota 1: {dia_util} == 'nao' → terminate() (encerra sem erro)
// Rota 2: true → Iniciar Processamento
