Pular para conteúdo

NUMBER - Capturar Número

O que é este Node?

O NUMBER é o node responsável por capturar números digitados pelo usuário com validação automática de formato numérico, range (min/max) e casas decimais.

Por que este Node existe?

Capturar números requer validação específica que texto livre não oferece. O NUMBER existe para:

  1. Validação automática: Garante que o usuário digitou um número válido (não texto)
  2. Range de valores: Valida se o número está entre min e max definidos
  3. Controle de decimais: Define se aceita inteiros (0 decimais) ou float (1, 2 decimais)
  4. Evitar erros: Impede que "abc" ou "R$ 50" sejam aceitos quando você espera "50"

Como funciona internamente?

Quando o NUMBER é executado, o sistema:

  1. Pausa o flow e exibe a pergunta
  2. Aguarda entrada do usuário
  3. Valida se é número: Rejeita texto, símbolos, etc.
  4. Valida min/max: Se definido, verifica se está no range
  5. Valida decimais: Verifica quantidade de casas decimais
  6. Se inválido: Pede novamente
  7. Se válido: Salva na variável e continua

Código interno (basic-flow-executor.service.ts:164-184):

private async executeNumber(parameters: any, context: any): Promise<any> {
  const { message, variable, min, max, decimals } = parameters;

  return {
    success: true,
    action: 'number_input_requested',
    inputType: 'number',
    message: message || 'Please enter a number:',
    variable: variable || 'user_number',
    validation: {
      required: true,
      type: 'number',
      min: min || null,
      max: max || null,
      decimals: decimals || 0
    },
    awaitingUserInput: true
  };
}

Quando você DEVE usar este Node?

Use NUMBER sempre que precisar de valores numéricos do usuário:

Casos de uso:

  1. Idade: "Qual é a sua idade?"
  2. Quantidade: "Quantas unidades você deseja?"
  3. Preço: "Qual o valor da compra?"
  4. Avaliação: "De 1 a 10, como você avalia?"
  5. Código numérico: "Digite o código de 6 dígitos"
  6. Peso/Altura: "Qual seu peso em kg?"

Quando NÃO usar NUMBER:

  • CEP/Telefone: Use INPUT com validação pattern (são "números" mas com formatação específica)
  • CPF/CNPJ: Use INPUT (tem dígitos verificadores e formatação)
  • Datas: Use DATE

Parâmetros Detalhados

message (string, obrigatório)

O que é: A pergunta que será mostrada ao usuário.

Flow completo para testar:

{
  "name": "Teste NUMBER - Message",
  "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?"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Você tem {{user_number}} anos."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "number_1" },
    { "source": "number_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

variable (string, opcional)

O que é: Nome da variável onde o número será salvo.

Padrão: "user_number"

Flow completo para testar:

{
  "name": "Teste NUMBER - Variable",
  "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": "number_2",
      "type": "number",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Pedir Peso",
        "parameters": {
          "message": "Qual seu peso em kg?",
          "variable": "peso",
          "decimals": 1
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Mostrar Dados",
        "parameters": {
          "message": "Idade: {{idade}} anos\nPeso: {{peso}} kg"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "number_1" },
    { "source": "number_1", "target": "number_2" },
    { "source": "number_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

min (number, opcional)

O que é: Valor mínimo aceito.

Flow completo para testar min:

{
  "name": "Teste NUMBER - Min",
  "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": "Idade Mínima 18",
        "parameters": {
          "message": "Qual é a sua idade? (mínimo 18)",
          "variable": "idade",
          "min": 18
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Idade válida: {{idade}} anos (maior de 18)"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "number_1" },
    { "source": "number_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite 17 - sistema rejeita! Digite 18 ou mais - aceita!

max (number, opcional)

O que é: Valor máximo aceito.

Flow completo para testar max:

{
  "name": "Teste NUMBER - Max",
  "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": "Nota Máxima 10",
        "parameters": {
          "message": "De 1 a 10, como você avalia?",
          "variable": "nota",
          "min": 1,
          "max": 10
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Obrigado pela nota {{nota}}!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "number_1" },
    { "source": "number_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite 11 - sistema rejeita! Digite 1 a 10 - aceita!

decimals (number, opcional)

O que é: Número de casas decimais aceitas.

Padrão: 0 (apenas inteiros)

Flow completo para testar decimals:

{
  "name": "Teste NUMBER - Decimals",
  "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": "Valor com Centavos",
        "parameters": {
          "message": "Qual o valor da compra? (Ex: 150.50)",
          "variable": "valor",
          "decimals": 2
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "💰 Valor informado: R$ {{valor}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "number_1" },
    { "source": "number_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite 150.50 - aceita! Digite 150.999 (3 decimais) - rejeita!

Exemplos Práticos Completos

Exemplo: Cadastro com Idade e Peso

{
  "name": "NUMBER - Cadastro Completo",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Pedir Nome",
        "parameters": {
          "message": "Qual é o seu nome?",
          "variable": "nome"
        }
      }
    },
    {
      "id": "number_1",
      "type": "number",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Pedir Idade",
        "parameters": {
          "message": "Qual é a sua idade?",
          "variable": "idade",
          "min": 0,
          "max": 120
        }
      }
    },
    {
      "id": "number_2",
      "type": "number",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Pedir Peso",
        "parameters": {
          "message": "Qual seu peso em kg?",
          "variable": "peso",
          "min": 1,
          "max": 300,
          "decimals": 1
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Resumo",
        "parameters": {
          "message": "✅ CADASTRO COMPLETO\n\n👤 Nome: {{nome}}\n🎂 Idade: {{idade}} anos\n⚖️ Peso: {{peso}} kg"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "number_1" },
    { "source": "number_1", "target": "number_2" },
    { "source": "number_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Resposta Técnica do Node

{
  "success": true,
  "action": "number_input_requested",
  "inputType": "number",
  "message": "Qual é a sua idade?",
  "variable": "idade",
  "validation": {
    "required": true,
    "type": "number",
    "min": 0,
    "max": 120,
    "decimals": 0
  },
  "awaitingUserInput": true
}

Casos de Uso Comuns

Caso Min Max Decimals
Idade 0 120 0
Nota (1-10) 1 10 0
Quantidade 1 999 0
Preço 0.01 99999.99 2
Peso (kg) 1 300 1
Altura (m) 0.5 2.5 2

Boas Práticas

Sempre defina min/max: Evita valores absurdos ✅ Use decimals apropriado: 0 para inteiros, 2 para dinheiro ✅ Indique o formato na mensagem: "Digite sua idade (0-120)" ✅ Confirme o valor capturado: Mostre em MESSAGE seguinte

Próximos Passos

EMAIL - Capturar emails com validação → PHONE - Capturar telefones → INPUT - Capturar texto livre