'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

AnveshKumar M
Tera Sage
Tera Sage

Hi @Thomas G 

I couldn't find any issue with code, I implemented this code as is in my PDI it worked perfectly. Try adding the alert messages and check the selected date and mindate variable values like the one below.

 

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);
        alert(selectedDate);
        alert(minDate);
        if (selectedDate < minDate) {
            g_form.addErrorMessage("Start date cannot precede the specified lead time of " + leadTimeDuration + ".");
            g_form.clearValue('start_date');
        }
    }
}

 

 

Thanks,
Anvesh

Hmm. The script works on my PDI too. Strange.

On my PDI where the script works, duration field are formatted like this: YYYY-MM-DD HH:MM:SS
On the instance where the script does not work, they are formatted like this: DD:MM:YYYY HH:MM:SS.

Should the script be modified in order to make it work in both scenarios, you think?

Hi @Thomas G 

Yes absolutely. Because the Date() constructor accepts YYYY-MM-DDTHH:mm:ss.sssZ format as constructor.

 

These are some examples of valid date (time) strings:

  • 2018-12-30
  • 2018-12-30T20:59
  • 2018-12-30T20:59:00
  • 2018-12-30T20:59:00.000Z
  • 2018-12-30T20:59:00.000+01:00
  • 2018-12-30T20:59:00.000-01:00

We need to handle other scenarios on our own to construct valid string.

 

I feel handling Date/Time Server Side is more easier for these reasons 😀

Thanks,
Anvesh