'Planned start date' check

Thomas G
Tera Guru

Hi,

I have created a custom choice type column on the change_request table called 'u_lead_time_duration'. On that I have defined three choices:
1_day_lead
3_days_lead
5_days_lead

The plan now is that if 1_day_lead is selected, it should not be possible to set a 'Planned start date' (start_date) less than 1 day (or 24 hours) ahead in time. 3_days_lead means not possible to select a 'Planned start date' less than 3 days ahead in time and so forth.

I have then created an onChange Client Script also on the change_request table looking at the field name 'Planned start date'. The script is this:

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue === '') {
return;
}

var startDate = g_form.getValue('start_date');
var leadTimeDuration = g_form.getValue('u_lead_time_duration');

if (startDate && leadTimeDuration) {
var minDate = new Date();
minDate.setHours(0, 0, 0, 0); // Set time to midnight

switch (leadTimeDuration) {
case '1_day_lead':
minDate.setDate(minDate.getDate() + 1);
break;
case '3_days_lead':
minDate.setDate(minDate.getDate() + 3);
break;
case '5_days_lead':
minDate.setDate(minDate.getDate() + 5);
break;
}

var selectedDate = new Date(startDate);

if (selectedDate < minDate) {
g_form.addErrorMessage("Start date cannot precede the specified lead time of " + leadTimeDuration + ".");
g_form.clearValue('start_date');
}
}
}

For some reason it does not work. I can still select a 'Planned start date' on, say, today, even if 5_days_lead is selected. 

Can you help me make this script work?

Best regards
Thomas
1 ACCEPTED SOLUTION

Hi @Thomas G 

Yes it would be easier. Before that can you please try this client script?

 

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        return;
    }
    var format = g_user_date_time_format;
    var startDate = g_form.getValue('start_date');
    var leadTimeDuration = g_form.getValue('u_lead_time_duration');

    if (startDate && leadTimeDuration) {
        var minDate = new Date();
        minDate.setHours(0, 0, 0, 0); // Set time to midnight

        switch (leadTimeDuration) {
            case '1_day_lead':
                minDate.setDate(minDate.getDate() + 1);
                break;
            case '3_days_lead':
                minDate.setDate(minDate.getDate() + 3);
                break;
            case '5_days_lead':
                minDate.setDate(minDate.getDate() + 5);
                break;
        }
        // get date strings into a number of milliseconds since 1970-01-01
        var startDateMs = getDateFromFormat(startDate, format);
        var leadDateMS = minDate.getTime();

        if (startDateMs < leadDateMS) {
            g_form.addErrorMessage("Start date cannot precede the specified lead time of " + leadTimeDuration + ".");
            g_form.clearValue('start_date');
        }
    }
}
Thanks,
Anvesh

View solution in original post

18 REPLIES 18

Thomas G
Tera Guru

Hi Palani and thanks,

I am not sure that I understand you. 'Lead time duration' is a choice type dictionary entry on the change_request table with three choices with the following values:

1_day_lead
3_days_lead
5_days_lead


Regards
Thpmas

Ankur Bawiskar
Tera Patron
Tera Patron

@Thomas G 

Did you debug by adding alert()?

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Thomas G
Tera Guru

Hi Ankur,

No. Maybe I should try that, thanks.

Regards
Thomas

Thomas G
Tera Guru

I have modified the code slightly calculating the date difference in hours instead of days to make it more precise and adding alerts to it, so it now looks like this:

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        return;
    }

    var startDate = g_form.getValue('start_date');
    var leadTimeDuration = g_form.getValue('u_lead_time_duration');

    if (startDate && leadTimeDuration) {
        var minDate = new Date();
        var minHours;

        switch (leadTimeDuration) {
            case '1_day_lead':
                minHours = 24;
                break;
            case '3_days_lead':
                minHours = 72;
                break;
            case '5_days_lead':
                minHours = 120;
                break;
            
        }

        minDate.setTime(minDate.getTime() + minHours * 60 * 60 * 1000); // Convert hours to milliseconds

        var selectedDate = new Date(startDate);

        alert('minDate: ' + minDate);
        alert('selectedDate: ' + selectedDate);

        if (selectedDate < minDate) {
            g_form.addErrorMessage("Start date cannot be set to a date and time earlier than " + leadTimeDuration + ".");
            g_form.clearValue('start_date');
        }
    }
}

As with the code from Anvesh earlier I just get a message saying: 'Invalid date' no matter what start date I choose if a 'Lead time duration' is set. I don't think it helps me that much.