Need help of a script include
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-02-2024 09:57 AM
Hi All,
I have a requirement as below in CHG management.
We have custom field called Maintenance window in the change form which is a list type field.
So based on the planned start date and end date on the change form and also business service priority T1 the maintenance window will be populated from Schedule entries (cmn_schedule_span) table and also an error message will also be displayed on the top of the change form.
And here we are checking only DAY and TIME from Scheduled Entries not the DATE.
When we change the dates on the change form, it is working correctly and displaying the schedules in the maintenance window field. But the same maintenance window/windows are not getting displayed on the error message at the top. It is showing wrongly.
Could you please help me here.
Is anything wrong in the script? Please assist.
var AddBannerMaintainanceWindow = Class.create();
AddBannerMaintainanceWindow.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getvalueBS: function() {
var bs = this.getParameter('sysparm_bs');
var sdate = this.getParameter('sysparm_sd');
var edate = this.getParameter('sysparm_ed');
var gdtend = new GlideDateTime(edate);
var EnddayOfWeek = gdtend.getDayOfWeek();
var crenddatetime = gdtend.getUTCValue();
var crendtime = crenddatetime.split(" ");
var onlycrendtime = crendtime[1];
var gdtstart = new GlideDateTime(sdate);
var nowdate = new GlideDateTime(sdate);
var dayOfWeek = nowdate.getDayOfWeek();
var time = gdtstart.getUTCValue();
var newtime = time.split(" ");
var onlytime = newtime[1];
var dayOfWeekArray = [];
// Populate dayOfWeekArray with dates and corresponding day of the week
var currentDate = new GlideDateTime(gdtstart);
while (currentDate <= gdtend) {
dayOfWeek = currentDate.getDayOfWeek();
dayOfWeekArray.push({
date: currentDate.getDisplayValue(),
dayOfWeek: dayOfWeek
});
currentDate.addDays(1);
}
// Call checkMaintenanceWindow for each day in dayOfWeekArray
for (var i = 0; i < dayOfWeekArray.length; i++) {
this.checkMaintenanceWindow(bs, onlytime, dayOfWeekArray[i].dayOfWeek, dayOfWeek);
gs.log("RK | Days: " + dayOfWeekArray[i].dayOfWeek + " " + dayOfWeek);
}
// Assuming you want to return something from this function
return responsebs.toString();
},
// Define the checkMaintenanceWindow function here
checkMaintenanceWindow: function(bs, onlytime, dayOfWeekArrayDayOfWeek, dayOfWeek) {
var sdate = this.getParameter('sysparm_sd');
var edate = this.getParameter('sysparm_ed');
var gdtend = new GlideDateTime(edate);
var crenddatetime = gdtend.getUTCValue();
var crendtime = crenddatetime.split(" ");
var onlycrendtime = crendtime[1];
var gdtstart = new GlideDateTime(sdate);
var nowdate = new GlideDateTime(sdate);
var time = gdtstart.getUTCValue();
var newtime = time.split(" ");
onlytime = newtime[1];
var bsddis = new GlideRecord("cmdb_ci_service");
bsddis.addQuery("sys_id", bs);
bsddis.query();
var displayvaluebs = "";
if (bsddis.next()) {
displayvaluebs = bsddis.name;
}
if (bsddis.u_priority == 'T1') {
var resultArray = [];
var grall1 = new GlideRecord("cmn_schedule_span");
grall1.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');
grall1.addEncodedQuery('days_of_week=' + dayOfWeekArrayDayOfWeek);
grall1.addEncodedQuery('repeat_type=weekly');
grall1.query();
while (grall1.next()) {
var flag = false;
var startmaint = grall1.getDisplayValue('start_date_time');
var endmaint = grall1.getDisplayValue('end_date_time');
var startonlymaint = startmaint.split(" ");
var endtimemaint = endmaint.split(" ");
var starttimeonlymaint = startonlymaint[1];
var endtimeonlymaint = endtimemaint[1];
var name = grall1.name;
if ((starttimeonlymaint < onlytime && onlytime < endtimeonlymaint) || (starttimeonlymaint < onlycrendtime && onlycrendtime < endtimeonlymaint)) {
var bsname = displayvaluebs.split(/\s+/);
var mWindowname = name.split(/\s+/);
for (var j = 0; j < mWindowname.length; j++) {
if (bsname.indexOf(mWindowname[j]) !== -1) {
flag = true;
}
}
if (!flag) {
var messageallnew = '<b><font size="3">"The defined Change Request window overlaps Maintenance Window,"</font></b>' +
'<b><font size="4">' + grall1.schedule.name + '</font></b>' +
'<b><font size="3">"Coordinate with the Technical Manager"</font></b><br>' +
'<font size="3"><b>Primary Contact - ' + grall1.schedule.u_pri_contact.getDisplayValue() + '</b></font><br>' +
'<font size="3"><b>Secondary Contact - ' + grall1.schedule.u_ec_contact.getDisplayValue() + '</b></font>';
gs.addErrorMessage(messageallnew);
}
}
}
}
},
type: 'AddBannerMaintainanceWindow'
});
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-02-2024 11:16 AM
In this example, the Maintenance window is getting set to Iris... but which schedule does it conflict with - what name should be displayed in the error message? Using the Name field from the schedule table when you have duplicate names (RES ESB Maintenance Window) could get confusing. Add some log lines to the script so that you can trace the values passed between functions and returned by GlideRecords and you will see where it is going wrong.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-05-2024 03:52 AM
Hi @Brad Bowman ,
Thank you for your response.
The IRIS should be displayed in the error message as well. There should not be any difference between maintenance window field values and also the error message maintenance window names. I have added logs as well, but I could see the same names which I showed in the above images. Please let me know if I need to make any changes in the script.
Also, could you please check if the below conditions are correct? Is this how we compare Day (Repeat on from schedule entries) with the Day from planned start date/end date on change form?
Please help.
grall1.addEncodedQuery('days_of_week=' + dayOfWeekArrayDayOfWeek); grall1.addEncodedQuery('repeat_type=weekly');
if ((starttimeonlymaint < onlytime && onlytime < endtimeonlymaint) || (starttimeonlymaint < onlycrendtime && onlycrendtime < endtimeonlymaint)) {