v2.0

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:

AbordagemQuando 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.

Desativar preserva a condição escrita O toggle é a chave de verdade: desmarcá-lo desliga a condição sem apagar o que está escrito em Condições para Execução, e a etapa passa a executar sempre. O texto fica guardado, pronto para reativar depois marcando o toggle de novo. Um rótulo ATIVADO (verde) ou DESATIVADO (vermelho) ao lado do toggle mostra o estado atual.
Painel Condições de Rotas e Execuções com Executar esta Etapa somente se ativado
Executar esta Etapa somente se, ativado: o builder visual monta a condição com SE / operador / valor, unindo mais de uma linha com E (AND) ou OU (OR).

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.

Modo manual da condição de execução, com JavaScript livre
Modo manual. JavaScript livre: a mesma condição do exemplo acima, escrita como expressão ({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:

Autocomplete de variáveis do processo ao digitar chave no editor manual
Digitar { no editor manual lista as variáveis do processo disponíveis para inserir na condição.
Mesma sintaxe das condições de rota A condição de execução usa exatamente a mesma linguagem das condições de Decisão e de Lógicas de Rota. Variáveis entre chaves, operadores de comparaçã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:

Badge de etapa condicional no canto do card
O badge ⊘ identifica, de relance, que a etapa só executa sob condição.

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

Tooltip da condição de execução ao passar o mouse sobre o badge
O mouseover no badge mostra o script da condição, útil para revisar o fluxo sem abrir cada 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:

Pular bloco de 3 etapas condicionais
[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:

Definir flag em etapa de captura (Regra Customizada)
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
});
Flag simples, sem código Quando a flag depende só de outras variáveis, a seção Variáveis do Fluxo da etapa de Regra Customizada a cria sem script. Por exemplo, uma variável 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):

Usar a flag: bloco inteiro (Decisão) ou etapa única (direto)
// 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:

Etapa "Enviar Relatório de Falhas": executar esta Etapa somente se
// {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 "Clicar e Baixar": executar esta Etapa somente se
// 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:

Checar dia da semana antes de acionar a API
// 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
Diferença entre skip e bypass O skip (execução condicional) evita que uma etapa seja executada quando a condição não é satisfeita, e é planejado no fluxo. O bypass (Gestão de Erros e Exceções) é o comportamento quando uma etapa tenta executar e falha, e é um desvio de erro.