Pular para conteúdo

CONDITION - Desvio Condicional

O que é este Node?

O CONDITION é o node responsável por criar bifurcações no flow baseadas em condições lógicas (if/else), permitindo que o flow tome caminhos diferentes dependendo de valores de variáveis.

Por que este Node existe?

Flows precisam tomar decisões. O CONDITION existe para:

  1. Bifurcação de lógica: Criar caminhos diferentes baseados em condições
  2. Validação: Verificar se variável atende critério antes de prosseguir
  3. Controle de flow: Direcionar para node diferente se/senão
  4. Comparações: idade > 18, status == "aprovado", etc.

Como funciona internamente?

Quando o CONDITION é executado, o sistema:

  1. Avalia a condição: Substitui variáveis ({{nome}}) pelos valores reais
  2. Executa comparação: Usa operadores ==, !=, >, <, >=, <=, &&, ||
  3. Retorna true/false
  4. Direciona flow: Se true vai para trueAction, se false vai para falseAction

Código interno (logic-control-executor.service.ts:57-83):

private async executeCondition(parameters: any, context: any): Promise<any> {
  const { condition, trueAction, falseAction, variables } = parameters;

  try {
    const result = this.evaluateCondition(condition, variables || context.variables || {});

    return {
      success: true,
      action: 'condition_evaluated',
      condition: condition,
      result: result,
      nextAction: result ? trueAction : falseAction,
      timestamp: new Date().toISOString()
    };
  } catch (error) {
    return {
      success: false,
      action: 'condition_failed',
      error: error.message,
      nextAction: falseAction
    };
  }
}

Quando você DEVE usar este Node?

Use CONDITION sempre que precisar tomar decisões no flow:

Casos de uso:

  1. Validar idade: "{{idade}} >= 18" para maioridade
  2. Verificar status: "{{status}} == 'ativo'" para continuar
  3. Checar estoque: "{{quantidade}} > 0" para vender
  4. Validar permissão: "{{role}} == 'admin'" para acesso
  5. Verificar valor: "{{total}} > 100" para desconto
  6. Múltiplas condições: "{{idade}} >= 18 && {{renda}} > 5000"

Parâmetros

Campo Tipo Obrigatório Descrição
condition string Sim Expressão lógica a avaliar
trueAction string Sim Node ID para ir se true
falseAction string Sim Node ID para ir se false
variables object Não Variáveis para usar (context.variables por padrão)

Operadores Suportados

Operador Descrição Exemplo
== Igual {{idade}} == 18
!= Diferente {{status}} != 'cancelado'
> Maior {{valor}} > 100
< Menor {{idade}} < 65
>= Maior ou igual {{nota}} >= 7
<= Menor ou igual {{estoque}} <= 10
&& E lógico {{idade}} >= 18 && {{renda}} > 0
|| OU lógico {{tipo}} == 'vip' || {{valor}} > 1000

Exemplo 1: Verificar Idade

{
  "name": "Verificar Maioridade",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "number_1",
      "type": "number",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Pedir Idade",
        "parameters": {
          "message": "Qual é a sua idade?",
          "variable": "idade"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Verificar Maioridade",
        "parameters": {
          "condition": "{{idade}} >= 18",
          "trueAction": "message_maior",
          "falseAction": "message_menor"
        }
      }
    },
    {
      "id": "message_maior",
      "type": "message",
      "position": { "x": 700, "y": 50 },
      "data": {
        "label": "Maior de Idade",
        "parameters": {
          "message": "✅ Você é maior de idade! Pode prosseguir."
        }
      }
    },
    {
      "id": "message_menor",
      "type": "message",
      "position": { "x": 700, "y": 150 },
      "data": {
        "label": "Menor de Idade",
        "parameters": {
          "message": "❌ Você é menor de idade. Acesso negado."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "number_1" },
    { "source": "number_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_maior", "condition": "true" },
    { "source": "condition_1", "target": "message_menor", "condition": "false" },
    { "source": "message_maior", "target": "end_1" },
    { "source": "message_menor", "target": "end_1" }
  ]
}

Exemplo 2: Verificar Estoque

{
  "name": "Verificar Estoque Disponível",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "number_1",
      "type": "number",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Quantidade",
        "parameters": {
          "message": "Quantas unidades você deseja?",
          "variable": "quantidade"
        }
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Verificar Estoque",
        "parameters": {
          "condition": "{{quantidade}} <= 50",
          "trueAction": "message_disponivel",
          "falseAction": "message_indisponivel"
        }
      }
    },
    {
      "id": "message_disponivel",
      "type": "message",
      "position": { "x": 700, "y": 50 },
      "data": {
        "label": "Em Estoque",
        "parameters": {
          "message": "✅ Temos {{quantidade}} unidades em estoque! Prosseguir com compra?"
        }
      }
    },
    {
      "id": "message_indisponivel",
      "type": "message",
      "position": { "x": 700, "y": 150 },
      "data": {
        "label": "Sem Estoque",
        "parameters": {
          "message": "❌ Desculpe, temos apenas 50 unidades em estoque."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "number_1" },
    { "source": "number_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_disponivel", "condition": "true" },
    { "source": "condition_1", "target": "message_indisponivel", "condition": "false" },
    { "source": "message_disponivel", "target": "end_1" },
    { "source": "message_indisponivel", "target": "end_1" }
  ]
}

Resposta do Node

{
  "success": true,
  "action": "condition_evaluated",
  "condition": "{{idade}} >= 18",
  "result": true,
  "nextAction": "message_maior",
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Boas Práticas

SIM: - Use condições simples e claras - Sempre defina trueAction E falseAction - Use variáveis com {{}} no condition - Teste ambos os caminhos (true e false)

NÃO: - Não faça condições muito complexas - Não esqueça de definir falseAction - Não use variáveis sem {{}}

Dicas

💡 Múltiplas condições: Use && (E) ou || (OU) 💡 Strings: Use aspas duplas: "{{status}} == 'ativo'" 💡 Números: Sem aspas: "{{idade}} >= 18" 💡 Debug: Use MESSAGE antes para ver valor da variável

Próximo Node

SWITCH - Múltiplas condições → VARIABLE - Manipular variáveis