방문 페이지의 헤더 메시지 구성

  • 릴리스 버전: Australia
  • 업데이트 날짜 2026년 03월 12일
  • 소요 시간: 19분
  • 방문 페이지에서 인사말 텍스트의 일부인 헤더 메시지를 구성합니다. 예: 3월 21일 월요일까지 당직입니다.

    시작하기 전에

    필요한 역할: 관리자

    이 태스크 정보

    서비스 데스크 에이전트 교대 근무 데이터 브로커 서버 스크립트 가져오기는 SOWServiceDeskAgentShift 스크립트 포함을 호출하여 인사말 텍스트에 교대조 정보를 표시합니다.

    기본 방문 페이지의 표시 텍스트를 사용자 지정할 수 있지만, 방문 페이지의 사본을 생성해야만 텍스트의 시각적 스타일을 변경할 수 있습니다.

    그림 1. 헤더 섹션
    인사말 텍스트
    주:

    SOW 배너에 있는 경보 알림은 자동으로 확장되어 전체 메시지가 표시됩니다. 이 기능은 기본적으로 기본 시스템에서 활성화됩니다. 전체 메시지를 자동으로 확장하여 표시하지 않으려면 auto_expand_now_alert_message 시스템 UX 페이지 속성을 false로 업데이트할 수 있습니다.

    프로시저

    1. 다음으로 이동 모두 > 서비스 운영 작업 공간 관리자 센터 > 개요.
    2. 개요 탭의 초기 설정 섹션에서 방문 페이지 구성 옵션을 선택합니다.
    3. 방문 페이지 양식에서 인사말 옆에 있는 구성을 선택합니다.
      내부적으로 SOWServiceDeskAgentShiftSNC를 호출하는 SOWServiceDeskAgentShift에 대해 스크립트 포함 양식이 표시됩니다.
    4. SOWServiceDeskAgentShiftSNC의 스크립트 값을 복사합니다.
      1. 다음으로 이동 모두 > 시스템 정의 > 스크립트 포함.
      2. 스크립트 포함 목록에서 SOWServiceDeskAgentShiftSNC를 엽니다.
      3. 스크립트 필드 값을 복사합니다.
    5. SOWServiceDeskAgentShift 스크립트를 편집합니다.
      1. 다음으로 이동 모두 > 시스템 정의 > 스크립트 포함.
      2. 스크립트 포함 목록에서 SOWServiceDeskAgentShift를 엽니다.
      3. 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(); 
        
            }, 
      4. 설명한 대로 스크립트의 다음 부분을 편집합니다.
                    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])]); 
        
                    } 
    6. 업데이트를 선택합니다.