1
resposta

Agendamento não aceita a data atual

Boa noite Teoricamente o método isSameOrAfter da biblioteca MomentJS deveria aceitar datas futuras e a data de hoje. Por exemplo, se hoje é dia 22/12/2020 posso marcar um atendimento para datas futuras ou para 22/12/2020. Quando entro com datas futuras não há problemas contudo, quanto insiro a data do dia em vigor, recebo o erro de data inválida. Não consegui identificar nada de errado no meu código. Vejam se vocês encontram algum erro por gentileza.

const moment = require('moment')
const conexao = require('../infraestrutura/conexao')

class Atendimento {
  adiciona(atendimento, res){
    const dataCriacao = moment().format("YYYY-MM-DD HH:mm:ss");
    const data = moment(atendimento.data, 'DD/MM/YYYY').format("YYYY-MM-DD HH:mm:ss");

    const dataEhValida = moment(data).isSameOrAfter(dataCriacao);
    const clienteEhValido = atendimento.cliente.length >= 5;

    const validacoes = [
      {
        nome: 'data',
        valido: dataEhValida,
        mensagem: 'Data deve ser maior ou igual a atual'
      },
      {
        nome: 'cliente',
        valido: clienteEhValido,
        mensagem: 'O nome do cliente deve ter pelo menos 5 caracteres'
      }
    ]

    const erros = validacoes.filter(campo => !campo.valido);
    const existemErros = erros.length; //Se = 0, não há erros, pois 0 é false

    if(existemErros){
      res.status(400).json(erros);
    } else {
      const atendimentoDatado = {...atendimento, data, dataCriacao,};

      const sql = 'INSERT INTO Atendimentos SET ?';

      conexao.query(sql, atendimentoDatado, (erro, resultados) =>{
        if(erro){
          res.status(400).json(erro);
        } else {
          res.status(201).json(resultados);
        }
      })
    }
  }
}

module.exports = new Atendimento;
1 resposta

Oi, Frederico, tudo bem?

De fato, quando colocada a data atual, é invalidada. Para que não aconteça esse comportamento, dentro do método moment colocamos o argumento da data atual.

O teste:

Na variável dataCriacao, dentro do método moment adicione a data que irão começar os agendamentos. Dessa forma: const dataCriacao = moment('2021-01-19').format('YYYY-MM-DD HH:MM:SS')

Então, o método isSameOrAfter que receber dataCriacao como parâmetro . Segue a documentação: https://momentjscom.readthedocs.io/en/latest/moment/05-query/05-is-same-or-after/

Qualquer dúvida, é só falar!