Business Rule Script

Joshuu
Kilo Sage

Hi All,

 

On the change request form, there is a custom field called Maintenance Window. And through below script we are populating schedule entries in the same field and also the error message/the banner. And this is list type field.

 

And there is another field as business service, and we are checking T1 priority business services.

 

Now we should also add a validation that the business Service should not trigger its own defined window alert. 

 

For example, below is a scenario.

user selected Business service contains 'Loyalty' on the change form.

Scheduled entries in the maintenance window field should not populate 'Loyalty' named choice.

 

Below are the business services and scheduled entries which we have. How to add this validation in this script? Please assist.

 

Business Services:

B2B

B2C

RES ESB

IRIS

Loyalty

Availability ESB

Concerto

Network 

 

priyarao_0-1727454438893.png

 

 

 

(function executeRule(current, previous /*null when async*/ ) {

    var startdate = current.start_date;
    var crend = current.getDisplayValue('end_date');
    var crstart = current.getDisplayValue('start_date');
    var gdt = new GlideDateTime(startdate);
    var dow = gdt.getDayOfWeek();
    var endate = current.end_date;
    var crstarttime = crstart.split(" ");
    var onlycrstarttime = crstarttime[1];
    var endgdt = new GlideDateTime(endate);
    var crendtime = crend.split(" ");
    var onlycrendtime = crendtime[1];
    var arr = [];
    var uniqueSchedules = {}; // Object to track unique schedule names

    current.setValue('u_maintainence_window', '');

    if (current.u_business_service.u_priority == 'T1') {

        var gr = new GlideRecord("cmn_schedule_span");
        gr.addEncodedQuery('schedule.nameINAvailability ESB Maintenance Window,B2B Maintenance Window,B2C Web Maintenance Window,Concerto Maintenance Window,Network/Infrastructure Maintenance Window,Network Maintenance Window,Network Firewall Maintenance,Loyalty Maintenance Window - PM,Loyalty Maintenance Window - AM,IRIS Weekly Maintenance Window,RES ESB Maintenance Window');
       
        gr.addEncodedQuery('days_of_weekCONTAINS' + dow);
        gr.query();
        while (gr.next()) {
           

            var startmaint = gr.getDisplayValue('start_date_time');
            var startdatetime = new GlideDateTime(startmaint);
          
            var endmaint = gr.getDisplayValue('end_date_time');
            var startonlymaint = startmaint.split(" ");
            var endtimemaint = endmaint.split(" ");
            var starttimeonlymaint = startonlymaint[1];
            var endtimeonlymaint = endtimemaint[1];
           

            var rec = [];
            rec.push(gr.schedule.u_contacts);
            var a = rec.join(',');
           
            if ((onlycrstarttime < starttimeonlymaint && starttimeonlymaint < onlycrendtime) ||
                (onlycrstarttime < endtimeonlymaint && endtimeonlymaint < onlycrendtime) || (starttimeonlymaint < onlycrstarttime && onlycrstarttime < endtimeonlymaint) ||
                (starttimeonlymaint < onlycrendtime && onlycrendtime < endtimeonlymaint)) {
                var scheduleName = gr.schedule.name.toString(); // Ensure schedule name is treated as string
                if (!uniqueSchedules.hasOwnProperty(scheduleName)) {
                    uniqueSchedules[scheduleName] = true; // Mark schedule name as seen
                    arr.push(scheduleName); // Push unique schedule name into the array
                    gs.log("RK | BR Inside if: " + scheduleName);
                }

                current.u_maintainence_window = arr.join(',');
                var messageallnew = '<b><font size="3">"The defined Change Request window overlaps Maintenance Window,"</font></b>' +
                    '<b><font size="4">' + gr.schedule.name + '</font></b>' +
                    '<b><font size="3">"Coordinate with the Technical Manager"</font></b><br>' +
                    '<font size="3"><b>Primary Contact - ' + gr.schedule.u_pri_contact.getDisplayValue() + '</b></font><br>' +
                    '<font size="3"><b>Secondary Contact - ' + gr.schedule.u_ec_contact.getDisplayValue() + '</b></font>';
                gs.addErrorMessage(messageallnew);
                var link = '<a href="https://ihguat.service-now.com/now/nav/ui/classic/params/target/cmn_schedule_span_list.do%3Fsysparm_query%3Dschedule.nameLIKEMaintenance%2520Window%26sysparm_first_row%3D1%26sysparm_view%3D%26sysparm_choice_query_raw%3D%26sysparm_list_header_search%3Dtrue">Maintenance Window</a>';
                gs.addInfoMessage(link);
                gs.log("RK | Schedule Message: " + gr.schedule.name);
                gs.eventQueue("noifyownerofchngemaint", current, gr.schedule.name, rec);
            }
        }
    }

})(current, previous);

 

 

 

Best Regards.

20 REPLIES 20

Hi @SANDEEP28 ,

 

Thank you for your response.

 

I have copied your script as is and still not working. I can still see the same choices in the maintenance window field and in the banner.

 

Could you please help on this.

SANDEEP28
Mega Sage

@Joshuu Share your updated script

Hi @SANDEEP28 ,

 

As per @Mani A suggestion, I have updated the script as below. It is working perfectly in the background script. 

 

But if I add it in my script, I am getting the output like, the maintenance field values are getting hidden for all the choices selected in business service. please find the below screenshots for reference.

 

In this example, it should hide loyalty values only for loyalty related choices from business service field.

 

priyarao_0-1727679218216.pngpriyarao_1-1727679278562.png

 

 

 

var x = ['Network Firewall Maintenance','Loyalty Maintenance Window - PM','Loyalty Maintenance Window - AM'];
gs.print(x);
var y = ['Loyalty'];

var arr = [];
for (var i = 0; i < x.length; i++) {
    if (x[i].indexOf(y.toString()) == -1) {
        arr.push(x[i]);
    }

}
gs.print(arr.join(','));

 

 

 

(function executeRule(current, previous /*null when async*/ ) {

    var startdate = current.start_date;
    var crend = current.getDisplayValue('end_date');
    var crstart = current.getDisplayValue('start_date');
    var gdt = new GlideDateTime(startdate);
    var dow = gdt.getDayOfWeek();
    var endate = current.end_date;
    //var endgdt=new GlideDateTime(endate);
    var crstarttime = crstart.split(" ");
    var onlycrstarttime = crstarttime[1];
    var endgdt = new GlideDateTime(endate);
    var crendtime = crend.split(" ");
    var onlycrendtime = crendtime[1];
    //gs.addErrorMessage("onlycrendtime br" + dow);
    var arr = [];
    var uniqueSchedules = {}; // Object to track unique schedule names


    current.setValue('u_maintainence_window', '');

    if (current.u_business_service.u_priority == 'T1') {

        var gr = new GlideRecord("cmn_schedule_span");
        gr.addEncodedQuery('schedule.nameINAvailability ESB Maintenance Window,B2B Maintenance Window,B2C Web Maintenance Window,Concerto Maintenance Window,Network/Infrastructure Maintenance Window,Network Maintenance Window,Network Firewall Maintenance,Loyalty Maintenance Window - PM,Loyalty Maintenance Window - AM,IRIS Weekly Maintenance Window,RES ESB Maintenance Window');
        //  gr.addEncodedQuery('days_of_week='+dow);
        gr.addEncodedQuery('days_of_weekCONTAINS' + dow);
        gr.query();
        while (gr.next()) {
            //gs.addErrorMessage('gr.name'+gr.name);

            var startmaint = gr.getDisplayValue('start_date_time');
            var startdatetime = new GlideDateTime(startmaint);
            //var dayofWeekMW=startdatetime.dayOfWeek;
            //gs.addInfoMessage('dayofWeekMW');
            var endmaint = gr.getDisplayValue('end_date_time');
            var startonlymaint = startmaint.split(" ");
            var endtimemaint = endmaint.split(" ");
            var starttimeonlymaint = startonlymaint[1];
            var endtimeonlymaint = endtimemaint[1];
            //gr.schedule.u_ec_contact
            //schedule.u_pri_contact

            var rec = [];
            rec.push(gr.schedule.u_contacts);
            var a = rec.join(',');
            //  gs.addErrorMessage(a);

            /*    if ((starttimeonlymaint < onlycrstarttime && onlycrstarttime < endtimeonlymaint) ||
                    (starttimeonlymaint < onlycrendtime && onlycrendtime < endtimeonlymaint)) { */
            if ((onlycrstarttime < starttimeonlymaint && starttimeonlymaint < onlycrendtime) ||
                (onlycrstarttime < endtimeonlymaint && endtimeonlymaint < onlycrendtime) || (starttimeonlymaint < onlycrstarttime && onlycrstarttime < endtimeonlymaint) ||
                (starttimeonlymaint < onlycrendtime && onlycrendtime < endtimeonlymaint)) {
                var scheduleName = gr.schedule.name.toString(); // Ensure schedule name is treated as string

                var x = ['B2C Web Maintenance Window', 'Loyalty Maintenance Window - AM', 'Loyalty Maintenance Window - PM'];

                var y = ['Loyalty'];
                if (!uniqueSchedules.hasOwnProperty(x)) {
                    uniqueSchedules[x] = true; // Mark schedule name as seen
                    for (var i = 0; i < x.length; i++) {
                        if (x[i].indexOf(y.toString()) == -1) {
                            arr.push(x[i]);
                        }
                    }
                    current.u_maintainence_window = arr.join(',');
                }
                var messageallnew = '<b><font size="3">"The defined Change Request window overlaps Maintenance Window,"</font></b>' +
                    '<b><font size="4">' + gr.schedule.name + '</font></b>' +
                    '<b><font size="3">"Coordinate with the Technical Manager"</font></b><br>' +
                    '<font size="3"><b>Primary Contact - ' + gr.schedule.u_pri_contact.getDisplayValue() + '</b></font><br>' +
                    '<font size="3"><b>Secondary Contact - ' + gr.schedule.u_ec_contact.getDisplayValue() + '</b></font>';
                gs.addErrorMessage(messageallnew);
                var link = '<a href="https://ihguat.service-now.com/now/nav/ui/classic/params/target/cmn_schedule_span_list.do%3Fsysparm_query%3Dschedule.nameLIKEMaintenance%2520Window%26sysparm_first_row%3D1%26sysparm_view%3D%26sysparm_choice_query_raw%3D%26sysparm_list_header_search%3Dtrue">Maintenance Window</a>';
                gs.addInfoMessage(link);
                gs.log("RK | Schedule Message: " + gr.schedule.name);
                gs.eventQueue("noifyownerofchngemaint", current, gr.schedule.name, rec);
            }
        }
    }

})(current, previous);

 

 

Joshuu
Kilo Sage

Hi @Mani A , @SANDEEP28 ,

 

For testing purpose, I have commented the entire script and included only below part. 

 

 

 

(function executeRule(current, previous /*null when async*/ ) {
    var x = ['Availability ESB Maintenance Window', 'B2B Maintenance Window', 'B2C Web Maintenance Window', 'Concerto Maintenance Window', 'Network/Infrastructure Maintenance Window', 'Network Maintenance Window', 'Network Firewall Maintenance', 'Loyalty Maintenance Window - PM', 'Loyalty Maintenance Window - AM', 'IRIS Weekly Maintenance Window', 'RES ESB Maintenance Window'];
    var y = current.u_business_service.getDisplayValue() ;
    var arr = [];
    for (var i = 0; i < x.length; i++) {
        if (x[i].indexOf(y.toString()) == -1) {
            arr.push(x[i]);
        }
    }
    current.u_maintainence_window = arr.join(',');

})(current, previous);

 

 

 

Output:

 

priyarao_0-1727714930241.png

 

 

So here it should hide loyalty options from maintenance window field. but it didn't work. Do we need to change anything? I think it is checking the complete name of business service with the maintenance window field value. but it should check only below keywords from business service field. 

 

'B2B', 'B2C', 'RES ESB', 'IRIS', 'Loyalty', 'Availability ESB', 'Concerto', 'Network'

 

Please assist.

 

You have to get business service name and split it accordingly for each BS

 

I have suggested already split logic in last my previous post..

 

So for each BS..you have to fetch the keyword after splitting it and use for loop logic