DATE - Capturar Data
O que é este Node?
O DATE é o node responsável por capturar datas digitadas pelo usuário com validação automática de formato (DD/MM/YYYY, YYYY-MM-DD, etc.), datas válidas e limites min/max.
Por que este Node existe?
Capturar datas requer validação complexa que texto livre não oferece. O DATE existe para:
- Validação automática: Garante que o texto é uma data válida (não aceita 31/02)
- Formato padronizado: Define formato esperado (brasileiro, americano, ISO)
- Range de datas: Valida se está entre minDate e maxDate
- Evitar erros: Impede que "amanhã" ou "12345" sejam aceitos
- Integrações: Formato consistente para banco de dados e APIs
Como funciona internamente?
Quando o DATE é executado, o sistema:
- Pausa o flow e exibe a pergunta
- Aguarda entrada do usuário
- Valida formato: Verifica se está no formato definido (DD/MM/YYYY, etc.)
- Valida data real: Verifica se é data válida (31/02 é rejeitado)
- Valida min/max: Se definido, verifica se está no range
- Se inválido: Pede novamente
- Se válido: Salva na variável e continua
Código interno (basic-flow-executor.service.ts:236-256):
private async executeDate(parameters: any, context: any): Promise<any> {
const { message, variable, format, minDate, maxDate } = parameters;
return {
success: true,
action: 'date_input_requested',
inputType: 'date',
message: message || 'Please enter a date:',
variable: variable || 'user_date',
validation: {
required: true,
type: 'date',
format: format || 'DD/MM/YYYY',
minDate: minDate || null,
maxDate: maxDate || null
},
awaitingUserInput: true
};
}
Quando você DEVE usar este Node?
Use DATE sempre que precisar de datas válidas do usuário:
Casos de uso
- Agendamento: "Qual data você prefere para a consulta?"
- Data de nascimento: "Qual é a sua data de nascimento?"
- Prazo: "Qual a data limite para entrega?"
- Período: "Data de início das férias"
- Validade: "Data de vencimento do documento"
- Histórico: "Em que data isso aconteceu?"
Quando NÃO usar DATE
- Hora/Horário: Use INPUT com pattern customizado ou implemente TIME node
- Período texto: Se aceita "semana que vem", use INPUT
Parâmetros Detalhados
message (string, obrigatório)
O que é: A pergunta que será mostrada ao usuário.
Flow completo para testar:
{
"name": "Teste DATE - Message",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "date_1",
"type": "date",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Pedir Data",
"parameters": {
"message": "Qual data você deseja agendar? (DD/MM/YYYY)"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Data agendada: {{user_date}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "date_1" },
{ "source": "date_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
variable (string, opcional)
O que é: Nome da variável onde a data será salva.
Padrão: "user_date"
Flow completo para testar:
{
"name": "Teste DATE - Variable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "date_1",
"type": "date",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Data Início",
"parameters": {
"message": "Data de início do evento:",
"variable": "data_inicio"
}
}
},
{
"id": "date_2",
"type": "date",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Data Fim",
"parameters": {
"message": "Data de término do evento:",
"variable": "data_fim"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Período",
"parameters": {
"message": "📅 Evento de {{data_inicio}} até {{data_fim}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "date_1" },
{ "source": "date_1", "target": "date_2" },
{ "source": "date_2", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
format (string, opcional)
O que é: Define o formato esperado da data.
Padrão: "DD/MM/YYYY"
Valores: DD/MM/YYYY, MM/DD/YYYY, YYYY-MM-DD, DD-MM-YYYY
Flow completo para testar format=YYYY-MM-DD:
{
"name": "Teste DATE - Format ISO",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "date_1",
"type": "date",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Data ISO",
"parameters": {
"message": "Digite a data no formato ISO (YYYY-MM-DD):",
"variable": "data_iso",
"format": "YYYY-MM-DD"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Data ISO: {{data_iso}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "date_1" },
{ "source": "date_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Digite 2025-12-25 - aceita! Digite 25/12/2025 - rejeita (formato errado)!
minDate (string, opcional)
O que é: Data mínima aceita.
Flow completo para testar minDate:
{
"name": "Teste DATE - MinDate (Apenas Futuro)",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "date_1",
"type": "date",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Data Entrega",
"parameters": {
"message": "Data de entrega (somente a partir de 15/01/2025):",
"variable": "data_entrega",
"minDate": "15/01/2025"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Entrega agendada para {{data_entrega}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "date_1" },
{ "source": "date_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Digite 10/01/2025 - rejeita! Digite 20/01/2025 - aceita!
maxDate (string, opcional)
O que é: Data máxima aceita.
Flow completo para testar maxDate:
{
"name": "Teste DATE - MaxDate (Apenas Passado)",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "date_1",
"type": "date",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Data Nascimento",
"parameters": {
"message": "Data de nascimento (até 31/12/2024):",
"variable": "data_nascimento",
"maxDate": "31/12/2024"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Nascimento: {{data_nascimento}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "date_1" },
{ "source": "date_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Digite 01/01/2025 - rejeita (futuro)! Digite 15/08/1990 - aceita!
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_date") |
| format | string | Não | Formato da data (padrão: "DD/MM/YYYY") |
| minDate | string | Não | Data mínima aceita |
| maxDate | string | Não | Data máxima aceita |
Exemplo 1: Agendar Consulta
Objetivo: Capturar data para agendamento
JSON para Importar
{
"name": "Agendar Consulta",
"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": "Apresentação",
"parameters": {
"message": "Vamos agendar sua consulta! 🏥"
}
}
},
{
"id": "date_1",
"type": "date",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Escolher Data",
"parameters": {
"message": "Qual data você prefere? (DD/MM/YYYY)",
"variable": "data_consulta",
"format": "DD/MM/YYYY"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Consulta agendada para {{data_consulta}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "date_1" },
{ "source": "date_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Vamos agendar sua consulta! 🏥
Sistema: Qual data você prefere? (DD/MM/YYYY)
Usuário: 20/03/2025
Sistema: ✅ Consulta agendada para 20/03/2025
Exemplo 2: Data de Nascimento
Objetivo: Coletar data de nascimento
JSON para Importar
{
"name": "Data de Nascimento",
"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?",
"variable": "nome"
}
}
},
{
"id": "date_1",
"type": "date",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Data Nascimento",
"parameters": {
"message": "Qual é a sua data de nascimento?",
"variable": "data_nascimento",
"format": "DD/MM/YYYY",
"maxDate": "31/12/2024"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "{{nome}}, nascido(a) em {{data_nascimento}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "date_1" },
{ "source": "date_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: Qual é o seu nome?
Usuário: Carlos Silva
Sistema: Qual é a sua data de nascimento?
Usuário: 15/08/1990
Sistema: Carlos Silva, nascido(a) em 15/08/1990
Exemplo 3: Prazo de Entrega (Data Futura)
Objetivo: Escolher data de entrega (apenas datas futuras)
JSON para Importar
{
"name": "Escolher Data Entrega",
"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": "Pedido",
"parameters": {
"message": "📦 Seu pedido está pronto para envio!"
}
}
},
{
"id": "date_1",
"type": "date",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Data Entrega",
"parameters": {
"message": "Qual a melhor data para entrega?",
"variable": "data_entrega",
"format": "DD/MM/YYYY",
"minDate": "13/01/2025"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "🚚 Entrega agendada para {{data_entrega}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "date_1" },
{ "source": "date_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: 📦 Seu pedido está pronto para envio!
Sistema: Qual a melhor data para entrega?
Usuário: 25/01/2025
Sistema: 🚚 Entrega agendada para 25/01/2025
Exemplo 4: Período (Data Início e Fim)
Objetivo: Capturar período de férias
JSON para Importar
{
"name": "Período de Férias",
"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": "Introdução",
"parameters": {
"message": "Vamos agendar suas férias! 🏖️"
}
}
},
{
"id": "date_1",
"type": "date",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Data Início",
"parameters": {
"message": "Data de início das férias:",
"variable": "data_inicio",
"format": "DD/MM/YYYY"
}
}
},
{
"id": "date_2",
"type": "date",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Data Fim",
"parameters": {
"message": "Data de retorno:",
"variable": "data_fim",
"format": "DD/MM/YYYY"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Resumo",
"parameters": {
"message": "✅ Férias agendadas!\n📅 Início: {{data_inicio}}\n📅 Retorno: {{data_fim}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "date_1" },
{ "source": "date_1", "target": "date_2" },
{ "source": "date_2", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Resposta do Node
{
"success": true,
"action": "date_input_requested",
"inputType": "date",
"message": "Qual data você prefere? (DD/MM/YYYY)",
"variable": "data_consulta",
"validation": {
"required": true,
"type": "date",
"format": "DD/MM/YYYY",
"minDate": null,
"maxDate": null
},
"awaitingUserInput": true
}
Formatos de Data
| Formato | Exemplo | Descrição |
|---|---|---|
| DD/MM/YYYY | 25/12/2025 | Padrão brasileiro |
| MM/DD/YYYY | 12/25/2025 | Padrão americano |
| YYYY-MM-DD | 2025-12-25 | Padrão ISO |
| DD-MM-YYYY | 25-12-2025 | Com hífen |
{
"parameters": {
"message": "Digite a data:",
"variable": "data",
"format": "DD/MM/YYYY" // Define o formato esperado
}
}
Validação com Min/Max
{
"parameters": {
"message": "Data de entrega:",
"variable": "data_entrega",
"format": "DD/MM/YYYY",
"minDate": "15/01/2025", // Não aceita antes de 15/01/2025
"maxDate": "31/12/2025" // Não aceita depois de 31/12/2025
}
}
Casos de Uso
| Caso | minDate | maxDate | Descrição |
|---|---|---|---|
| Data Nascimento | 01/01/1900 | Hoje | Nascimento no passado |
| Agendamento Futuro | Hoje | - | Apenas datas futuras |
| Período Específico | 01/01/2025 | 31/12/2025 | Range definido |
| Qualquer Data | - | - | Sem restrições |
Validação Automática
O node DATE valida automaticamente:
✅ Formato: Verifica se está no formato definido ✅ Data válida: Valida se é data real (ex: 31/02 é rejeitado) ✅ Min/Max: Valida se está dentro do range ✅ Required: Data obrigatória por padrão
Se usuário digitar data inválida, sistema pede novamente.
Exemplos Válidos/Inválidos
Formato DD/MM/YYYY:
✅ Válidos:
25/12/2025
01/01/2024
15/08/1990
❌ Inválidos:
31/02/2025 (fevereiro não tem 31 dias)
2025/12/25 (formato errado)
25-12-2025 (separador errado)
Dicas
💡 Indique o formato: "Digite a data (DD/MM/YYYY)" 💡 Use minDate/maxDate: Previna datas impossíveis 💡 Valide contexto: Data nascimento deve ser passado 💡 Confirme sempre: Mostre a data capturada
Próximo Node
→ LOCATION - Capturar localização → PHONE - Capturar telefone