Pular para conteúdo

PHONE - Capturar Telefone

O que é este Node?

O PHONE é o node responsável por capturar números de telefone digitados pelo usuário com validação automática de formato, DDD, DDI e padrões internacionais.

Por que este Node existe?

Capturar telefones requer validação específica que texto livre não oferece. O PHONE existe para:

  1. Validação automática: Garante que o número digitado está no formato correto (DDD + número)
  2. Normalização: Aceita vários formatos (com parênteses, traços, espaços) e normaliza
  3. Validação por país: Valida regras específicas de cada país (BR, US, PT, etc.)
  4. Evitar erros: Impede que "123" ou "telefone" sejam aceitos
  5. Integração facilitada: Formato padronizado para envio de SMS, WhatsApp, chamadas

Como funciona internamente?

Quando o PHONE é executado, o sistema:

  1. Pausa o flow e exibe a pergunta
  2. Aguarda entrada do usuário
  3. Valida formato: Verifica se está no padrão do país (DDD, comprimento)
  4. Normaliza: Remove caracteres especiais se format=digits_only
  5. Se inválido: Pede novamente
  6. Se válido: Salva na variável e continua

Código interno (basic-flow-executor.service.ts:212-231):

private async executePhone(parameters: any, context: any): Promise<any> {
  const { message, variable, format, country } = parameters;

  return {
    success: true,
    action: 'phone_input_requested',
    inputType: 'phone',
    message: message || 'Please enter your phone number:',
    variable: variable || 'user_phone',
    validation: {
      required: true,
      type: 'phone',
      format: format || 'international',
      country: country || 'BR'
    },
    awaitingUserInput: true
  };
}

Quando você DEVE usar este Node?

Use PHONE sempre que precisar de números de telefone válidos do usuário:

Casos de uso:

  1. Cadastro: "Qual é o seu telefone?"
  2. Confirmação SMS: "Telefone para envio do código"
  3. Delivery: "Telefone para contato na entrega"
  4. Agendamento: "Telefone para confirmação"
  5. Suporte: "Telefone para ligação de retorno"
  6. WhatsApp: "Telefone para contato via WhatsApp"

Quando NÃO usar PHONE:

  • Código numérico: Se é apenas código (ex: 123456), use NUMBER
  • Telefone internacional sem país: Use INPUT com pattern customizado

Parâmetros Detalhados

message (string, obrigatório)

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

Flow completo para testar:

{
  "name": "Teste PHONE - Message",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "phone_1",
      "type": "phone",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Pedir Telefone",
        "parameters": {
          "message": "Qual é o seu telefone com DDD?"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Telefone capturado: {{user_phone}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "phone_1" },
    { "source": "phone_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

variable (string, opcional)

O que é: Nome da variável onde o telefone será salvo.

Padrão: "user_phone"

Flow completo para testar:

{
  "name": "Teste PHONE - Variable",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "phone_1",
      "type": "phone",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Telefone Celular",
        "parameters": {
          "message": "Qual é o seu celular?",
          "variable": "celular"
        }
      }
    },
    {
      "id": "phone_2",
      "type": "phone",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Telefone Fixo",
        "parameters": {
          "message": "Qual é o seu telefone fixo?",
          "variable": "telefone_fixo"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Mostrar Telefones",
        "parameters": {
          "message": "📱 Celular: {{celular}}\n☎️ Fixo: {{telefone_fixo}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "phone_1" },
    { "source": "phone_1", "target": "phone_2" },
    { "source": "phone_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

format (string, opcional)

O que é: Define o formato esperado do telefone.

Padrão: "international"

Valores: - "international" → Aceita +55 11 98765-4321 - "national" → Aceita (11) 98765-4321 - "digits_only" → Aceita apenas 11987654321

Flow completo para testar format=digits_only:

{
  "name": "Teste PHONE - Format Digits Only",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "phone_1",
      "type": "phone",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Telefone Apenas Números",
        "parameters": {
          "message": "Digite seu telefone (apenas números, com DDD):",
          "variable": "telefone",
          "format": "digits_only"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Telefone: {{telefone}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "phone_1" },
    { "source": "phone_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite 11987654321 - aceita! Digite (11) 98765-4321 - normaliza!

country (string, opcional)

O que é: Código do país para validação específica.

Padrão: "BR" (Brasil)

Valores: BR, US, PT, AR, etc.

Flow completo para testar country=BR:

{
  "name": "Teste PHONE - Country BR",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "phone_1",
      "type": "phone",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Telefone Brasil",
        "parameters": {
          "message": "Qual é o seu telefone? (DDD + número)",
          "variable": "telefone_br",
          "country": "BR"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Telefone brasileiro: {{telefone_br}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "phone_1" },
    { "source": "phone_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite 11987654321 (válido), 123456 (inválido - muito curto)

Parâmetros

Campo Tipo Obrigatório Descrição
message string Sim Pergunta para o usuário
variable string Não Nome da variável (padrão: "user_phone")
format string Não Formato do telefone (padrão: "international")
country string Não Código do país (padrão: "BR")

Exemplo 1: Cadastro de Telefone

Objetivo: Capturar telefone para contato

JSON para Importar

{
  "name": "Cadastro Telefone",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "phone_1",
      "type": "phone",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Pedir Telefone",
        "parameters": {
          "message": "Qual é o seu telefone? (com DDD)",
          "variable": "telefone",
          "country": "BR"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Telefone {{telefone}} cadastrado!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "phone_1" },
    { "source": "phone_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Qual é o seu telefone? (com DDD)
Usuário: 11987654321
Sistema: ✅ Telefone 11987654321 cadastrado!

Exemplo 2: Delivery com Telefone

Objetivo: Coletar endereço e telefone para entrega

JSON para Importar

{
  "name": "Pedido Delivery",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Boas-vindas",
        "parameters": {
          "message": "🍕 Vamos fazer seu pedido!"
        }
      }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Pedir Endereço",
        "parameters": {
          "message": "Qual é o endereço de entrega?",
          "variable": "endereco"
        }
      }
    },
    {
      "id": "phone_1",
      "type": "phone",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Pedir Telefone",
        "parameters": {
          "message": "Telefone para contato:",
          "variable": "telefone_contato",
          "country": "BR"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Confirmar Pedido",
        "parameters": {
          "message": "Perfeito!\n📍 Endereço: {{endereco}}\n📱 Telefone: {{telefone_contato}}\n\nPedido confirmado!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "input_1" },
    { "source": "input_1", "target": "phone_1" },
    { "source": "phone_1", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 🍕 Vamos fazer seu pedido!
Sistema: Qual é o endereço de entrega?
Usuário: Rua das Flores, 123
Sistema: Telefone para contato:
Usuário: 11999887766
Sistema: Perfeito!
         📍 Endereço: Rua das Flores, 123
         📱 Telefone: 11999887766

         Pedido confirmado!

Exemplo 3: Agendamento

Objetivo: Coletar telefone para confirmação de agendamento

JSON para Importar

{
  "name": "Agendamento com Telefone",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Serviço",
        "parameters": {
          "message": "Você escolheu: Corte de Cabelo\n💰 Valor: R$ 50,00"
        }
      }
    },
    {
      "id": "phone_1",
      "type": "phone",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Pedir Telefone",
        "parameters": {
          "message": "Telefone para confirmarmos o agendamento:",
          "variable": "telefone_cliente",
          "country": "BR"
        }
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Agendamento confirmado!\nEntraremos em contato via {{telefone_cliente}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "phone_1" },
    { "source": "phone_1", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Você escolheu: Corte de Cabelo
         💰 Valor: R$ 50,00
Sistema: Telefone para confirmarmos o agendamento:
Usuário: 21987654321
Sistema: ✅ Agendamento confirmado!
         Entraremos em contato via 21987654321

Exemplo 4: Cadastro Completo

Objetivo: Flow completo com nome, email e telefone

JSON para Importar

{
  "name": "Cadastro Completo Cliente",
  "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": "Nome",
        "parameters": {
          "message": "Qual é o seu nome completo?",
          "variable": "nome"
        }
      }
    },
    {
      "id": "email_1",
      "type": "email",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Email",
        "parameters": {
          "message": "Qual é o seu email?",
          "variable": "email"
        }
      }
    },
    {
      "id": "phone_1",
      "type": "phone",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Telefone",
        "parameters": {
          "message": "Qual é o seu telefone?",
          "variable": "telefone",
          "country": "BR"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Resumo",
        "parameters": {
          "message": "✅ Cadastro concluído!\n\n👤 Nome: {{nome}}\n📧 Email: {{email}}\n📱 Telefone: {{telefone}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "email_1" },
    { "source": "email_1", "target": "phone_1" },
    { "source": "phone_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Resposta do Node

{
  "success": true,
  "action": "phone_input_requested",
  "inputType": "phone",
  "message": "Qual é o seu telefone? (com DDD)",
  "variable": "telefone",
  "validation": {
    "required": true,
    "type": "phone",
    "format": "international",
    "country": "BR"
  },
  "awaitingUserInput": true
}

Formatos Aceitos (Brasil)

Celular:
11987654321
(11) 98765-4321
+55 11 98765-4321

Fixo:
1133334444
(11) 3333-4444
+55 11 3333-4444

Parâmetros de Formato

Formato Descrição Exemplo
international Formato internacional +55 11 98765-4321
national Formato nacional (11) 98765-4321
digits_only Apenas dígitos 11987654321
{
  "parameters": {
    "message": "Digite seu telefone:",
    "variable": "telefone",
    "format": "digits_only",  // Apenas números
    "country": "BR"           // Brasil
  }
}

Códigos de País

País Código DDI
Brasil BR +55
EUA US +1
Portugal PT +351
Argentina AR +54

Validação Automática

O node PHONE valida automaticamente:

Formato: Verifica se está no formato correto ✅ Comprimento: Valida quantidade de dígitos ✅ DDD válido: Para Brasil, valida DDD

Se usuário digitar número inválido, sistema pede novamente.

Dicas

💡 Indique o formato: "Digite seu telefone com DDD" 💡 Aceite variações: Sistema normaliza diferentes formatos 💡 Country BR: Use para telefones brasileiros 💡 Confirme sempre: Mostre o telefone capturado

Próximo Node

DATE - Capturar data → EMAIL - Capturar email