Pular para conteúdo

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:

  1. Validação automática: Garante que o texto é uma data válida (não aceita 31/02)
  2. Formato padronizado: Define formato esperado (brasileiro, americano, ISO)
  3. Range de datas: Valida se está entre minDate e maxDate
  4. Evitar erros: Impede que "amanhã" ou "12345" sejam aceitos
  5. Integrações: Formato consistente para banco de dados e APIs

Como funciona internamente?

Quando o DATE é executado, o sistema:

  1. Pausa o flow e exibe a pergunta
  2. Aguarda entrada do usuário
  3. Valida formato: Verifica se está no formato definido (DD/MM/YYYY, etc.)
  4. Valida data real: Verifica se é data válida (31/02 é rejeitado)
  5. Valida min/max: Se definido, verifica se está no range
  6. Se inválido: Pede novamente
  7. 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

  1. Agendamento: "Qual data você prefere para a consulta?"
  2. Data de nascimento: "Qual é a sua data de nascimento?"
  3. Prazo: "Qual a data limite para entrega?"
  4. Período: "Data de início das férias"
  5. Validade: "Data de vencimento do documento"
  6. 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