홈 페이지에서 인사말 텍스트의 일부인 헤더 메시지를 사용자 지정합니다. 이렇게 하면 보다 개인화된 사용자 경험을 제공하여 방문자가 환영받고 가치 있다고 느끼게 하고 제시된 정보에 대한 올바른 어조와 컨텍스트를 설정하는 데 도움이 될 수 있습니다.
시작하기 전에
필요한 역할: evt_mgmt_admin 또는 admin
이 태스크 정보
서비스 데스크 에이전트 교대 근무 데이터 브로커 서버 스크립트 가져오기는 SOWServiceDeskAgentShift 스크립트 포함을 호출하여 인사말 텍스트에 교대조 정보를 표시합니다.
기본 방문 페이지의 표시 텍스트를 사용자 지정할 수 있지만, 방문 페이지의 사본을 생성해야만 텍스트의 시각적 스타일을 변경할 수 있습니다.
3월 21일 월요일까지 당직을 맡는다고 가정해 보겠습니다. 인사말을 업데이트하여 당직 상태를 반영할 수 있습니다.그림 1. 머리글
프로시저
다음으로 이동 모두 > 서비스 운영 작업 공간 관리자 센터 > 개요.
개요 탭의 초기 설정 섹션에서 방문 페이지 구성 옵션을 선택합니다.
방문 페이지 양식에서 인사말 옆에 있는 구성을 선택합니다.
내부적으로 SOWServiceDeskAgentShiftSNC를 호출하는 SOWServiceDeskAgentShift에 대해 스크립트 포함 양식이 표시됩니다.
SOWServiceDeskAgentShiftSNC의 스크립트 값을 복사합니다.
다음으로 이동 모두 > 시스템 정의 > 스크립트 포함.
스크립트 포함 목록에서 SOWServiceDeskAgentShiftSNC를 엽니다.
그림 2. 스크립트 포함 목록
스크립트 필드 값을 복사합니다.
그림 3. 스크립트 포함 상세 정보 페이지
SOWServiceDeskAgentShift 스크립트를 편집합니다.
다음으로 이동 모두 > 시스템 정의 > 스크립트 포함.
스크립트 포함 목록에서 SOWServiceDeskAgentShift를 엽니다.
SOWServiceDeskAgentShiftSNC에서 복사한 스크립트 필드 값을 붙여넣습니다.
initialize: function() {
this.PLUGINS = {
ON_CALL: "com.snc.on_call_rotation",
SHIFT_PLANNING: "com.sn_shift_planning"
};
this.DAYS_AHEAD = gs.getProperty('com.snc.on_call_rotation.upcoming_rota_days', 30);
this.DATE_FORMAT = gs.getDateFormat();
this.TIME_FORMAT = gs.getTimeFormat();
this.WFO_SCHEMA_IDENTIFIER = 'readInTimezone';
this.WFO_ONCALL_TYPE_IDENTIFIER = 'oncallAPIReadInTimezone';
this.WEEK_DAY_FORMAT = 'EEEE';
this.FORMAT = {
SERVICE_DESK_HEADER: 'SERVICE_DESK_HEADER'
};
this.DATE_TIME_FORMAT_FULL = "full";
},
getUpcomingShift: function(userId, outputFormat, wfoShift) {
var upcomingShifts, gd = new GlideDate();
var from = gd.getDisplayValueInternal();
gd.addDaysLocalTime(this.DAYS_AHEAD);
var to = gd.getDisplayValueInternal();
var mayBeWFOUser = userId == gs.getUserID() ? gs.hasRole("sn_shift_planning.agent") : true;
if (GlidePluginManager.isActive(this.PLUGINS.SHIFT_PLANNING) && mayBeWFOUser && wfoShift)
upcomingShifts = this.getWFOShifts(from, to, userId);
var isWFOResponseValid = Array.isArray(upcomingShifts) && upcomingShifts.length > 0;
if (!isWFOResponseValid && GlidePluginManager.isActive(this.PLUGINS.ON_CALL))
upcomingShifts = this.getOnCallShifts(from, to, userId);
return this.getFormattedShift(upcomingShifts, outputFormat);
},
getWFOShifts: function(from, to, userId) {
var smUtil = new sn_shift_planning.ScheduleManagerUtil();
var defaultEventCategories = [
smUtil.WORK_CATEGORY_SYS_ID,
smUtil.ON_CALL_CATEGORY_SYS_ID
];
var params = {
"assignmentGroups": "",
"individualAgents": userId,
"startDate": from,
"endDate": to,
"published": true,
"eventCategories": defaultEventCategories,
"filter": {
"sn_shift_planning_agent_schedule": {
"event": ["8d03fd9b0f310010717cc562ff767e4a", "936319993bd02010e81a4ee1f3efc419"]
}
}
};
var upcomingShifts = [];
try {
var agentScheduleRESTAPIUtils = new sn_shift_planning.AgentScheduleRESTAPIUtils();
var spans = agentScheduleRESTAPIUtils.retrieveAgentSchedulesFromParams(params);
if (spans && spans.shiftData && spans.shiftData.user && spans.shiftData.user.data && spans.shiftData.user.data.length > 0 && spans.shiftData.user.data[0].schedules) {
var schedules = spans.shiftData.user.data[0].schedules,
arrayUtil = new global.ArrayUtil();
for (var schedule in schedules)
upcomingShifts = arrayUtil.union(upcomingShifts, schedules[schedule]);
}
} catch (e) {
gs.error("SOWServiceDeskAgentShiftSNC: Error fetching WFO shifts");
}
return upcomingShifts;
},
getOnCallShifts: function(from, to, userId) {
var onCallCommon = new global.OnCallCommon();
var onCallGroups = onCallCommon.getMyGroups();
var spans = new global.OCRotationV2(null, global.OCRotationV2.DEFAULT_FORMAT_OPTION).setStartDate(from).setEndDate(to).setUserIds(userId).setGroupIds(onCallGroups).getSpans();
var upcomingShifts = [];
for (var i = 0; i < spans.length; i++)
if ((spans[i].type == "roster" || spans[i].type == "override") && spans[i].user_id == userId)
upcomingShifts.push(spans[i]);
return upcomingShifts;
},
getFormattedShift: function(upcomingShifts, outputFormat) {
if (gs.nil(upcomingShifts))
return;
switch (outputFormat) {
case this.FORMAT.SERVICE_DESK_HEADER:
return this.getServiceDeskFormattedShift(upcomingShifts);
default:
return upcomingShifts;
}
},
getServiceDeskFormattedShift: function(upcomingShifts) {
var response = {
shiftText: "",
nearestShift: {}
};
var startAttr = "start",
endAttr = "end",
isOnCall = true;
var dateFormat = 'EEEE, MMM dd',
timeFormat = 'hh:mm a';
var isWFOSchema = Array.isArray(upcomingShifts) && upcomingShifts.length > 0 && this.WFO_SCHEMA_IDENTIFIER in upcomingShifts[0];
if (isWFOSchema)
startAttr = "scheduledStartTime", endAttr = "scheduledEndTime";
response.nearestShift = this.getNearestShift(upcomingShifts, startAttr, endAttr);
if (response.nearestShift) {
if (isWFOSchema) {
if (response.nearestShift.schedule && !(this.WFO_ONCALL_TYPE_IDENTIFIER in response.nearestShift.schedule))
isOnCall = false;
}
if (isOnCall) {
if (response.nearestShift.isCurrent) {
if (response.nearestShift.roster_name)
response.shiftText = gs.getMessage("You are on-call until {0} as {1}", [this.getFormattedDateTime(response.nearestShift[endAttr]), response.nearestShift.roster_name]);
else
response.shiftText = gs.getMessage("You are on-call until {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]);
} else {
if (response.nearestShift.roster_name)
response.shiftText = gs.getMessage("Your next on-call shift starts on {0} as {1}", [this.getFormattedDateTime(response.nearestShift[startAttr]), response.nearestShift.roster_name]);
else
response.shiftText = gs.getMessage("Your next on-call shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]);
}
} else {
if (response.nearestShift.isCurrent) {
response.shiftText = gs.getMessage("Your shift ends on {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]);
} else
response.shiftText = gs.getMessage("Your next shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]);
}
}
return response;
},
getNearestShift: function(upcomingShifts, startAttr, endAttr) {
if (gs.nil(upcomingShifts) || gs.nil(startAttr) || gs.nil(endAttr))
return;
var nearestShift;
upcomingShifts.sort(function(shift_1, shift_2) {
var gdt1 = new GlideDateTime();
gdt1.setDisplayValueInternal(shift_1[startAttr]);
var gdt2 = new GlideDateTime();
gdt2.setDisplayValueInternal(shift_2[startAttr]);
return GlideDateTime.subtract(gdt2, gdt1).getNumericValue();
});
var currentDateTime = new GlideDateTime(),
startDateTime = new GlideDateTime(),
endDateTime = new GlideDateTime();
for (var i = 0; i < upcomingShifts.length; i++) {
startDateTime.setDisplayValueInternal(upcomingShifts[i][startAttr] + "");
endDateTime.setDisplayValueInternal(upcomingShifts[i][endAttr] + "");
if (currentDateTime.onOrBefore(endDateTime)) {
nearestShift = upcomingShifts[i];
if (currentDateTime.onOrAfter(startDateTime))
nearestShift.isCurrent = true;
else
nearestShift.isCurrent = false;
break;
}
}
return nearestShift;
},
getFormattedDateSpan: function(date, dateFormat, timeFormat) {
var formattedDate = this.getFormattedDate(date, dateFormat);
var dateAmPmTime = this.getFormattedTime(date, timeFormat);
return formattedDate + " " + dateAmPmTime;
},
getFormattedDate: function(inputDate, format) {
var date = new GlideDateTime();
date.setDisplayValueInternal(inputDate);
format = !format ? this.DATE_FORMAT : format;
var gd = date.getLocalDate();
return gd.getByFormat(format);
},
getFormattedTime: function(inputDate, format) {
var date = new GlideDateTime();
date.setDisplayValueInternal(inputDate);
format = !format ? this.TIME_FORMAT : format;
var gt = date.getLocalTime();
return gt.getByFormat(format);
},
getFormattedDateTime: function(date) {
var dateTime = new GlideDateTime();
dateTime.setDisplayValueInternal(date);
return dateTime.getDisplayValueLang(this.DATE_TIME_FORMAT_FULL);
},
endsToday: function(inputDate) {
var inputGdt = new GlideDateTime();
inputGdt.setDisplayValueInternal(inputDate);
return new GlideDateTime().getLocalDate().getValue() == inputGdt.getLocalDate().getValue();
},
endingTomorrow: function(inputDate) {
var inputGdt = new GlideDateTime();
inputGdt.setDisplayValueInternal(inputDate);
var tomorrowDateTime = new GlideDateTime();
tomorrowDateTime.addDaysLocalTime(1);
return tomorrowDateTime.getLocalDate().getValue() == inputGdt.getLocalDate().getValue();
},
설명한 대로 스크립트의 다음 부분을 편집합니다.
if (isOnCall) {
if (response.nearestShift.isCurrent) {
if (response.nearestShift.roster_name)
response.shiftText = gs.getMessage("You are on-call until {0} as {1}", [this.getFormattedDateTime(response.nearestShift[endAttr]), response.nearestShift.roster_name]);
else
response.shiftText = gs.getMessage("You are on-call until {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]);
} else {
if (response.nearestShift.roster_name)
response.shiftText = gs.getMessage("Your next on-call shift starts on {0} as {1}", [this.getFormattedDateTime(response.nearestShift[startAttr]), response.nearestShift.roster_name]);
else
response.shiftText = gs.getMessage("Your next on-call shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]);
}
} else {
if (response.nearestShift.isCurrent) {
response.shiftText = gs.getMessage("Your shift ends on {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]);
} else
response.shiftText = gs.getMessage("Your next shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]);
}