Script para comparar data início com data atual

Alan Carvalho
Tera Contributor

Olá comunidade!

 

Realizei a criação de um item de catálogo onde preciso restringir que o usuário informe uma data inicial maior que 7 dias a partir da data atual. Obs: Tenho outras regras que envolvem essa data inicial e essas funcionam normalmente.

Para isso, configurei um script include com a seguinte parte do código para tratar essa regra:

AlanCarvalho_0-1683826276676.png

 

Ao inserir a data na variável do item de catálogo, a regra funciona restringindo a inserção apenas dos dias entre 19 e 31 de qualquer mês, seja ele o atual o subsequente. Ex: Ao preencher a variável com a data 19/05/2023 a regra é acionada e funciona perfeitamente, porém ao inserir o dia 01/06/2023 a regra não é acionada.

AlanCarvalho_1-1683826331176.pngAlanCarvalho_2-1683826360838.png

 

AlanCarvalho_4-1683826427714.pngAlanCarvalho_5-1683826450083.pngAlanCarvalho_6-1683826473749.pngAlanCarvalho_7-1683826501301.png

 

Alguém pode me ajudar a identificar qual o erro e como devo corrigir?

 

 

1 ACCEPTED SOLUTION

Leonardo Bentes
ServiceNow Employee
ServiceNow Employee

Olá Alan,

 

Me parece que o problema é que você está comparando as datas no formato 'dd/MM/yyyy'. No seu exemplo, quando o if comparar '11/05/2023' com '01/06/2023', 11/05 será maior que 01/06, pois o "1" (primeiro dígito da data de maio) é maior que "0" (primeiro dígito da data de junho). Quando se lida com datas, é um boa prática usar o formato ano + mes + dia, pois assim as comparações serão feitas como esperamos.

 

Experimente rodar este teste no background script para verificar o comportamento:

 

if ('01/06/2023' > '19/05/2023') {
    gs.info('é maior');
} else {
    gs.info('não é maior');
}

if ('2023/06/01' > '2023/05/19') {
    gs.info('é maior');
} else {
    gs.info('não é maior');
}
 

Então, se você trocar a formatação de 'dd/MM/yyyy' para 'yyyy/MM/dd' deve resolver o problema. Inclusive a barra nem é necessária neste caso, podendo usar 'yyyyMMdd'.

 

Além disso, vale a pena dar um olhada no método getValue(). Ao executar (com base no seu exemplo) 

gs.info(dateInicial.getValue())
você terá como retorno '2023-05-19'. Ou seja, já num formato mais adequado para comparação. Assim, se você quiser "enxugar" seu código, pode fazer algo na seguinte linha:
 
var dateInicial = this.perParameter('sysparm_startDate');
dateInicial = new GlideDateTime(dateInicial);
dateInicial = dateInicial.getDate();
 
var today = new GlideDate();
today.addDaysUTC(7);

if (dateInicial.getValue() > today.getValue()) {
   return '3';
}
 
Boa sorte,
 
Leo
 

View solution in original post

3 REPLIES 3

Leonardo Bentes
ServiceNow Employee
ServiceNow Employee

Olá Alan,

 

Me parece que o problema é que você está comparando as datas no formato 'dd/MM/yyyy'. No seu exemplo, quando o if comparar '11/05/2023' com '01/06/2023', 11/05 será maior que 01/06, pois o "1" (primeiro dígito da data de maio) é maior que "0" (primeiro dígito da data de junho). Quando se lida com datas, é um boa prática usar o formato ano + mes + dia, pois assim as comparações serão feitas como esperamos.

 

Experimente rodar este teste no background script para verificar o comportamento:

 

if ('01/06/2023' > '19/05/2023') {
    gs.info('é maior');
} else {
    gs.info('não é maior');
}

if ('2023/06/01' > '2023/05/19') {
    gs.info('é maior');
} else {
    gs.info('não é maior');
}
 

Então, se você trocar a formatação de 'dd/MM/yyyy' para 'yyyy/MM/dd' deve resolver o problema. Inclusive a barra nem é necessária neste caso, podendo usar 'yyyyMMdd'.

 

Além disso, vale a pena dar um olhada no método getValue(). Ao executar (com base no seu exemplo) 

gs.info(dateInicial.getValue())
você terá como retorno '2023-05-19'. Ou seja, já num formato mais adequado para comparação. Assim, se você quiser "enxugar" seu código, pode fazer algo na seguinte linha:
 
var dateInicial = this.perParameter('sysparm_startDate');
dateInicial = new GlideDateTime(dateInicial);
dateInicial = dateInicial.getDate();
 
var today = new GlideDate();
today.addDaysUTC(7);

if (dateInicial.getValue() > today.getValue()) {
   return '3';
}
 
Boa sorte,
 
Leo
 

Olá @Leonardo Bentes,

 

Continuo na saga para resolver esse problema.

Segui as suas orientações de formatação de data e de "enxugar" o código mais ainda continua com o problema na comparação.

Vou adicionar aqui os dois scripts envolvidos nesse processo, os quais foram desenvolvidos por parceiro ServiceNow e não tenho mais o suporte do mesmo.

 

Esse é o Script do cliente de catálogo:

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
 
    //Clears the value of fields and shows message in the fields when the values do not respect the rules assigned to them.
    var startDate = g_form.getValue('u_data_inicial');
    var endDate = g_form.getValue('u_data_final');
 
if (endDate != "" && endDate < startDate) {
g_form.clearValue('u_data_final');
g_form.showFieldMsg('u_data_final', getMessage('The End Date cannot be less than the Start Date'), 'error', true);
}
 
    if (startDate == endDate) {
        g_form.clearValue('u_data_inicial');
        g_form.showFieldMsg('u_data_inicial', getMessage('The Start Date and End Date cannot be the same'), 'error', true);
    }
 
    var ajax = new GlideAjax('AjaxDurCalc');
 
    ajax.addParam('sysparm_name', 'durCalc2');
    ajax.addParam('sysparm_startDate', startDate);
    ajax.addParam('sysparm_endDate', endDate);
    ajax.getXML(callback);
 
    function callback(response) {
        var answer = response.responseXML.documentElement.getAttribute("answer");
        if (answer == '1') {
            g_form.clearValue('u_data_inicial');
            g_form.clearValue('u_data_final');
            g_form.showFieldMsg('u_data_final', getMessage('Start Date and End Date cannot exceed 8 hours difference'), 'error', true);
        } else if (answer == '2') {
            g_form.clearValue('u_data_inicial');
            g_form.clearValue('u_data_final');
            g_form.showFieldMsg('u_data_final', getMessage('The Start Date and End Date cannot be on different days'), 'error', true);
        } else if (answer == '3') {
            g_form.clearValue('u_data_inicial');
            g_form.showFieldMsg('u_data_inicial', getMessage('The Start Date cannot be more than 7 days from today'), 'error', true);
        }
 
    }
}
 
Esse é o Scipt Include:
var AjaxDurCalc = Class.create();
AjaxDurCalc.prototype = Object.extendsObject(AbstractAjaxProcessor, {
 
    durCalc: function() {
        var dateInicial = (this.getParameter('sysparm_startDate'));
dateInicial = new GlideDateTime(dateInicial);
dateInicial = dateInicial.getDate();
dateInicial = dateInicial.getByFormat('dd/MM/yyyy');
 
var dateFinal = (this.getParameter('sysparm_endDate'));
dateFinal = new GlideDateTime(dateFinal);
dateFinal = dateFinal.getDate();
dateFinal = dateFinal.getByFormat('dd/MM/yyyy');
 
if (dateFinal != dateInicial){
return "2";
}
var diferenceDate = gs.dateDiff(this.getParameter('sysparm_startDate'), this.getParameter('sysparm_endDate'), true);
diferenceDate = diferenceDate / 3600;
if (diferenceDate > 8){
return "1";
}
 
    },
 
durCalc2: function() {
 
        var dateInicial = (this.getParameter('sysparm_startDate'));
dateInicial = new GlideDateTime(dateInicial);
 
dateInicial = dateInicial.getDate();
var today = new GlideDate();
today.addDaysUTC(7);
gs.info(today);
if (dateInicial.getValue() > today.getValue()){
return '3';
}
 
dateInicial = dateInicial.getByFormat('dd/MM/yyyy');
 
var dateFinal = this.getParameter('sysparm_endDate');
dateFinal = new GlideDateTime(dateFinal);
dateFinal = dateFinal.getDate();
dateFinal = dateFinal.getByFormat('dd/MM/yyyy');
 
 
 
if (dateFinal != dateInicial){
return "2";
}
var diferenceDate = gs.dateDiff(this.getParameter('sysparm_startDate'), this.getParameter('sysparm_endDate'), true);
diferenceDate = diferenceDate / 3600;
if (diferenceDate > 8){
return "1";
}
 },
 
    type: 'AjaxDurCalc'
});

 

Será que ainda consegue me ajudar?

Elicio_Junior
Tera Contributor

Veja se esse código possa lhe ajudar:

Deixei ele genérico pra poder aplicar tanto em SI Server Side quanto Client fazendo os devidos ajustes.

var initialDateFromClient = '2023-07-03 18:00:00'

var initDate = new GlideDateTime(initialDateFromClient)
var now = new GlideDateTime()

gs.info('Data Atual: '+now) //Debug

now.addDaysUTC(7)
gs.info('Data Máxima: '+now) //Debug

gs.info('Data Inicial Escolhida: '+initDate) //Debug

/* 
Equals (0)
initDate is after now(1)
initDate is before now(-1)
*/
var dur = initDate.compareTo(now)

gs.info(dur) //Debug

if(dur == 1){
    gs.info('Data não permitida')
} else {
    gs.info('Data permitida')
}