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:
- Validação automática: Garante que o usuário digitou um número válido (não texto)
- Range de valores: Valida se o número está entre min e max definidos
- Controle de decimais: Define se aceita inteiros (0 decimais) ou float (1, 2 decimais)
- Evitar erros: Impede que "abc" ou "R$ 50" sejam aceitos quando você espera "50"
Como funciona internamente?
Quando o NUMBER é executado, o sistema:
- Pausa o flow e exibe a pergunta
- Aguarda entrada do usuário
- Valida se é número: Rejeita texto, símbolos, etc.
- Valida min/max: Se definido, verifica se está no range
- Valida decimais: Verifica quantidade de casas decimais
- Se inválido: Pede novamente
- 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:
- Idade: "Qual é a sua idade?"
- Quantidade: "Quantas unidades você deseja?"
- Preço: "Qual o valor da compra?"
- Avaliação: "De 1 a 10, como você avalia?"
- Código numérico: "Digite o código de 6 dígitos"
- 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