Pular para conteúdo

SWITCH - Múltiplas Condições

O que é este Node?

O SWITCH é o node responsável por criar múltiplos caminhos baseados no valor de uma variável (equivalente ao switch/case da programação), permitindo direcionar o flow para diferentes destinos dependendo do valor.

Por que este Node existe?

Quando você tem mais de 2 opções, usar múltiplos IF fica complexo. O SWITCH existe para:

  1. Múltiplas opções: Direcionar para N caminhos diferentes
  2. Menu de opções: Usuário escolhe 1, 2, 3 → diferentes ações
  3. Status diferentes: Pedido pode ser: pendente, aprovado, cancelado, enviado
  4. Categorias: Produto pode ser: eletrônico, roupa, alimento
  5. Código limpo: Mais legível que múltiplos IFs encadeados

Como funciona internamente?

Quando o SWITCH é executado, o sistema:

  1. Pega valor da variável
  2. Compara com cada case
  3. Encontra match: Vai para targetNode do case correspondente
  4. Sem match: Vai para defaultCase

Código interno (logic-control-executor.service.ts:88-109):

private async executeSwitch(parameters: any, context: any): Promise<any> {
  const { variable, cases, defaultCase, variables } = parameters;

  const currentVariables = variables || context.variables || {};
  const value = currentVariables[variable];

  // Find matching case
  const matchingCase = cases?.find(c => c.value === value);
  const nextAction = matchingCase ? matchingCase.targetNode : defaultCase;

  return {
    success: true,
    action: 'switch_evaluated',
    variable: variable,
    value: value,
    matchingCase: matchingCase?.value || null,
    nextAction: nextAction,
    timestamp: new Date().toISOString()
  };
}

Quando você DEVE usar este Node?

Use SWITCH quando tiver 3 ou mais opções baseadas em 1 variável:

Casos de uso:

  1. Menu numérico: 1=Vendas, 2=Suporte, 3=Financeiro
  2. Status de pedido: pendente/aprovado/cancelado/enviado
  3. Tipo de produto: eletrônico/roupa/alimento/livro
  4. Plano escolhido: básico/pro/enterprise
  5. Departamento: RH/TI/Marketing/Vendas

Parâmetros

Campo Tipo Obrigatório Descrição
variable string Sim Nome da variável a avaliar
cases array Sim Array de
defaultCase string Sim Node ID para ir se nenhum case match
variables object Não Variáveis (context.variables padrão)

Estrutura de Cases

{
  "cases": [
    { "value": "1", "targetNode": "node_vendas" },
    { "value": "2", "targetNode": "node_suporte" },
    { "value": "3", "targetNode": "node_financeiro" }
  ],
  "defaultCase": "node_opcao_invalida"
}

Exemplo 1: Menu de Atendimento

{
  "name": "Menu de Atendimento",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 200 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 200 },
      "data": {
        "label": "Menu",
        "parameters": {
          "message": "Bem-vindo! Escolha uma opção:\\n\\n1️⃣ Vendas\\n2️⃣ Suporte\\n3️⃣ Financeiro"
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 500, "y": 200 },
      "data": {
        "label": "Capturar Escolha",
        "parameters": {
          "message": "Digite o número da opção:",
          "variable": "opcao"
        }
      }
    },
    {
      "id": "switch_1",
      "type": "switch",
      "position": { "x": 700, "y": 200 },
      "data": {
        "label": "Direcionar",
        "parameters": {
          "variable": "opcao",
          "cases": [
            { "value": "1", "targetNode": "message_vendas" },
            { "value": "2", "targetNode": "message_suporte" },
            { "value": "3", "targetNode": "message_financeiro" }
          ],
          "defaultCase": "message_invalido"
        }
      }
    },
    {
      "id": "message_vendas",
      "type": "message",
      "position": { "x": 900, "y": 50 },
      "data": {
        "label": "Vendas",
        "parameters": {
          "message": "💼 Você foi direcionado para Vendas!"
        }
      }
    },
    {
      "id": "message_suporte",
      "type": "message",
      "position": { "x": 900, "y": 150 },
      "data": {
        "label": "Suporte",
        "parameters": {
          "message": "🛠️ Você foi direcionado para Suporte!"
        }
      }
    },
    {
      "id": "message_financeiro",
      "type": "message",
      "position": { "x": 900, "y": 250 },
      "data": {
        "label": "Financeiro",
        "parameters": {
          "message": "💰 Você foi direcionado para Financeiro!"
        }
      }
    },
    {
      "id": "message_invalido",
      "type": "message",
      "position": { "x": 900, "y": 350 },
      "data": {
        "label": "Opção Inválida",
        "parameters": {
          "message": "❌ Opção inválida. Tente novamente."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 200 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "input_1" },
    { "source": "input_1", "target": "switch_1" },
    { "source": "switch_1", "target": "message_vendas", "case": "1" },
    { "source": "switch_1", "target": "message_suporte", "case": "2" },
    { "source": "switch_1", "target": "message_financeiro", "case": "3" },
    { "source": "switch_1", "target": "message_invalido", "case": "default" },
    { "source": "message_vendas", "target": "end_1" },
    { "source": "message_suporte", "target": "end_1" },
    { "source": "message_financeiro", "target": "end_1" },
    { "source": "message_invalido", "target": "end_1" }
  ]
}

Resposta do Node

{
  "success": true,
  "action": "switch_evaluated",
  "variable": "opcao",
  "value": "2",
  "matchingCase": "2",
  "nextAction": "message_suporte",
  "timestamp": "2025-01-15T10:30:00.000Z"
}

Diferença: SWITCH vs CONDITION

Feature CONDITION SWITCH
Opções 2 (true/false) N opções
Comparações Expressões complexas Igualdade simples
Uso idade >= 18 opcao == "1"
Quando usar Lógica booleana Menu de opções

Boas Práticas

SIM: - Sempre defina defaultCase - Use valores simples nos cases (strings ou números) - Organize cases logicamente

NÃO: - Não use SWITCH para apenas 2 opções (use CONDITION) - Não esqueça defaultCase

Dicas

💡 Valores: Cases comparam com igualdade estrita (===) 💡 Strings: "1" !== 1 (são diferentes!) 💡 Default: Sempre captura opções inválidas 💡 Debug: Use MESSAGE antes para ver valor da variável

Próximo Node

CONDITION - Condições simples → LOOP - Repetir ações