Field Service의 예약 규칙은 사용자 지정 조건에 따라 리소스 예약 레코드를 생성하거나 편집할 때 사용자에게 표시되는 경고 또는 오류 메시지를 생성합니다. 예를 들어 작업에 필요한 특성이 없는 일정 보드의 리소스에 작업 주문을 예약하려고 할 때 사용자에게 경고하는 예약 규칙을 만들 수 있습니다.
예약 규칙은 예약 가능 리소스 예약 레코드가 작성되거나 편집되기 전에 실행되는 사용자 정의 JavaScript 메서드입니다. JavaScript 메서드는 작성 중인 예약 가능한 리소스 예약 레코드에 대한 정보를 포함하는 매개 변수를 승인할 수 있으며 필수 특성이 있는 JavaScript 개체를 반환해야 합니다.
예약을 만들거나 수정할 때 예약을 검사하는 예약 규칙을 설정합니다.
비고
- 예약 규칙은 시간별 보기에만 적용되며, 일정 게시판 및 일정 도우미의 일별, 주별, 월별 보기에는 적용되지 않습니다. 예약 가능한 리소스 예약 양식을 통해 예약이 생성되거나 업데이트될 때도 사용할 수 있습니다.
- 양식에서 비즈니스 프로세스 흐름이 사용된 경우 예약 가능한 리소스 예약 양식에서 예약 규칙을 사용할 수 없습니다.
- 예약 규칙은 예약 게시판의 재할당 기능에서 사용할 수 없습니다.
- 각 사용자 지정 예약 규칙은 오류 또는 경고를 하나만 반환할 수 있습니다. 여러 메시지를 반환하려면 각 확인에 대해 개별 예약 규칙을 설정하세요.
솔루션 만들기
사용자 지정 JavaScript 웹 리소스를 만듭니다. Microsoft Power 앱에서 솔루션을 만들어 사용자 지정 JavaScript 웹 리소스를 추가하거나 사용자 지정에 사용하는 기존 솔루션을 사용하는 것이 좋습니다.
예약 규칙 JavaScript 웹 리소스에 대한 새 솔루션을 만듭니다. 솔루션에서 기본 게시자가 아닌 고유 게시자를 사용하는 것이 좋습니다.
솔루션을 만든 후 새 웹 리소스를 만듭니다.
JavaScript(JS)를 유형으로 선택합니다.
예약 규칙에 대한 JavaScript 코드를 입력합니다.
저장 및 게시를 선택합니다.
예약 규칙 설정
Field Service로 이동하여 리소스 영역을 선택합니다.
예약 설정에서 예약 규칙을을 선택한 다음 새로 만들기를 선택합니다.
다음 정보를 입력합니다.
- 예약 규칙 이름입니다.
- 최근에 만든 웹 리소스입니다.
- JavaScript에서 정의한 메소드 이름입니다.
저장 & 닫기를 선택합니다. 예약 규칙은 일정 게시판 및 일정 도우미 또는 엔터티 양식의 시간별 보기에서 사용됩니다.
비고
예약 규칙은 일정 게시판 및 일정 도우미의 시간별 보기에서만 지원됩니다. 예약 가능한 리소스 예약 양식을 사용하여 예약을 생성하거나 업데이트할 때도 예약 규칙이 지원됩니다. 예약 규칙은 예약 기록 삭제 시 실행되지 않습니다. 다중 편집을 사용할 때 양식에서 예약 규칙이 작동하지 않습니다. 규칙 실행을 중지하려면 예약 규칙을 비활성화합니다.
사용자 지정 프로세스 작업 만들기
예약 규칙의 일부로 유효성 검사를 수행하는 사용자 지정 프로세스 작업을 만듭니다. 사용자 지정 웹 리소스의 JavaScript에서 사용자 지정 프로세스 작업을 호출하고 작업의 결과를 평가합니다. 샘플 코드로 이동하여 사용자 지정 프로세스 작업을 호출하는 방법을 확인합니다.
사용자 지정 웹 리소스에 대해 정의한 솔루션을 사용하여 사용자 지정 프로세스 작업을 추가하는 것이 좋습니다.
다음 입력 및 출력 매개 변수를 사용합니다. 시나리오에 따라 추가 입력 및 출력 매개 변수를 추가할 수 있습니다. 사용자 지정 프로세스 작업을 호출하기 위해 정의한 JavaScript가 다른 입력 및 출력 매개 변수를 지원하도록 업데이트되었는지 확인해야 합니다.
입력 매개 변수:
- originalScheduleStart – DateTime
- 원래일정종료 – DateTime
- originalBookableResource – EntityReference
- originalScheduleSource – Picklist
- newScheduleStart – DateTime
- 새일정종료 – DateTime
- isCreate – Boolean
- isUpdate – Boolean
출력 매개 변수:
- isError – 불리언 (Boolean)
- isWarning – Boolean(불리언)
- errorMessage – 문자열
- warningMessage - String
다음 스크린 샷은 사용자 지정 프로세스 작업의 예를 보여줍니다. 이 샘플은 newBookableResource가 작업 주문의 기본 리소스와 일치하는지 여부와 newScheduleStart가 약속 시작 시간과 약속 종료 시간 내에 있는지 확인합니다. 약속된 기간의 날짜는 단일 날짜인 것으로 가정합니다. 예: 약속 시작 시간: 01/01/2016 8:00AM / 약속 종료 시간: 01/01/2016 12:00PM.
샘플 코드
생성한 JavaScript 함수는 예약 컨텍스트로 간주되는 단일 매개 변수를 허용할 수 있습니다. 전달된 예약 컨텍스트 매개 변수는 클라이언트 측 스크립팅에 사용되는 일반적인 CRM 컨텍스트가 아닙니다.
예약 컨텍스트 스키마:
export type BookingRuleContext = {
oldValues: BookingRuleBookingRecord;
newValues: BookingRuleBookingRecord;
isCreate: boolean;
isUpdate: boolean;
};
export type BookingRuleBookingRecord = {
ResourceRequirementId?: string;
ResourceId?: string;
StartTime?: Date;
EndTime?: Date;
ResourceScheduleSource?: string;
};
예약 컨텍스트 매개 변수는 다음 JavaScript 정의를 갖습니다.
비고
예약 규칙에 대한 사용자 지정 웹 리소스에 이 JavaScript 코드를 포함할 필요가 없습니다.
ResourceScheduleSource의 가능한 값은 리소스 예약 소스 전역 옵션 집합에서 가져옵니다. 이 속성을 사용하여 예약 게시판 또는 일정 도우미에서 예약 규칙이 트리거되는지 확인할 수 있습니다.
var sbContext = {
oldValues: {
StartTime: "01/01/2016 08:00AM",
EndTime: "01/01/2016 05:00PM",
ResourceId: "00000000-0000-0000-0000-00000000",
ResourceScheduleSource: 690970001
},
newValues: {
StartTime: "01/01/2016 08:00AM",
EndTime: "01/01/2016 05:00PM",
ResourceId: "00000000-0000-0000-0000-00000000",
ResourceScheduleSource: 690970001
},
isCreate: true,
isUpdate: false
};
유효성 검사 방법은 다음 정의를 가진 JavaScript 개체를 반환해야 합니다.
비고
예약 규칙에 대한 사용자 지정 웹 리소스에 이 JavaScript 코드를 포함할 필요가 없습니다.
var ruleResult = {
IsValid: false,
Message: "Some Message Here",
Type: "error" // this can be either "error" or "warning"
};
JavaScript 함수 정의 예. 다음 JavaScript 코드는 사용자 지정 웹 리소스에 포함해야 하는 유일한 JavaScript 코드입니다.
function Validate(ctx) {
var url = Xrm.Page.context.getClientUrl();
var ruleResult = {
IsValid: false,
Message: '',
Type: 'error'
};
//
// perform some lookups or other validation logic here.
//
ruleResult.IsValid = false;
ruleResult.Message = 'Some Error Message Here.';
ruleResult.Type = 'error';
return ruleResult;
}
다음 JavaScript는 이전 샘플과 동일한 입력 및 출력 매개 변수가 있는 사용자 정의 CRM 조치를 호출하는 데 사용할 수 있습니다.
예약 규칙 레코드의 방법 이름이 MSFSAENG.ScheduleBoard.Validate여야 합니다. 참고로 이 문서의 "예약 규칙 설정" 섹션에 있는 스크린 샷을 참조하십시오.
/// <reference path="xrm.d.ts" />
function brErrorCallback(sb) {
// Add custom error handeling here if desired.
return;
}
function brWarningCallback(sb) {
// Add custom warning handeling here if desired.
return;
}
function brSuccessCallback(sb) {
// add custom sucess handeling here if desired.
return;
}
var MSFSAENG;
(function (MSFSAENG) {
MSFSAENG.ScheduleBoard = {
url: Xrm.Page.context.getClientUrl() + "/api/data/v8.1/",
actionName: "msfsaeng_MSFSAScheduleBoardRuleActionSample",
actionInputParameters: function (ctx) {
var inputParameters = {};
if (ctx.isUpdate) {
inputParameters = {
"originalScheduleStart": ctx.oldValues.StartTime,
"originalScheduleEnd": ctx.oldValues.EndTime,
"originalBookableResource": {
"@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
"bookableresourceid": ctx.oldValues.ResourceId,
"name": ""
},
"originalScheduleSource": ctx.oldValues.ResourceScheduleSource,
"newScheduleStart": ctx.newValues.StartTime,
"newScheduleEnd": ctx.newValues.EndTime,
"newBookableResource": {
"@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
"bookableresourceid": ctx.newValues.ResourceId,
"name": ""
},
"newScheduleSource": ctx.newValues.ResourceScheduleSource,
"isCreate": ctx.isCreate,
"isUpdate": ctx.isUpdate
};
}
else {
inputParameters = {
"newScheduleStart": ctx.newValues.StartTime,
"newScheduleEnd": ctx.newValues.EndTime,
"newBookableResource": {
"@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
"bookableresourceid": ctx.newValues.ResourceId,
"name": ""
},
"newScheduleSource": ctx.newValues.ResourceScheduleSource,
"isCreate": ctx.isCreate,
"isUpdate": ctx.isUpdate
};
}
return JSON.stringify(inputParameters);
},
ctx: null,
ruleResult: {
IsValid: true,
Message: "",
Type: ""
},
outputParameters: {
isError: false,
isWarning: false,
errorMessage: "",
warningMessage: ""
},
Validate: function (context) {
this.ctx = context;
ScheduleBoardHelper.callActionWebApi(this);
return this.ruleResult;
},
errorCallback: brErrorCallback,
warningCallback: brWarningCallback,
successCallback: brSuccessCallback
};
var ScheduleBoardHelper = (function () {
function ScheduleBoardHelper() {
}
ScheduleBoardHelper.callActionWebApi = function (sb) {
var oDataEndpoint = sb.url + sb.actionName;
var req = new XMLHttpRequest();
req.open("POST", oDataEndpoint, false);
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function () {
if (req.readyState == 4) {
req.onreadystatechange = null;
if (req.status == 200) {
sb.outputParameters = JSON.parse(req.response);
if (sb.outputParameters.isError) {
sb.ruleResult.IsValid = false;
sb.ruleResult.Message = sb.outputParameters.errorMessage;
sb.ruleResult.Type = 'error';
if (sb.errorCallback)
sb.errorCallback(sb);
return;
}
else if (sb.outputParameters.isWarning) {
sb.ruleResult.IsValid = false;
sb.ruleResult.Message = sb.outputParameters.warningMessage;
sb.ruleResult.Type = 'warning';
if (sb.warningCallback)
sb.warningCallback(sb);
return;
}
else {
sb.ruleResult.IsValid = true;
sb.ruleResult.Message = '';
sb.ruleResult.Type = '';
if (sb.successCallback)
sb.successCallback(sb);
return;
}
}
else {
alert('Error calling Rule Action. Response = ' + req.response + ', Status = ' + req.statusText);
}
}
};
req.send(sb.actionInputParameters(sb.ctx));
};
return ScheduleBoardHelper;
}());
})(MSFSAENG || (MSFSAENG = {}));
추가적인 참고 사항
예약 가능한 리소스 예약은 예약 규칙을 사용하여 사용자 지정 조건에 따라 리소스 예약 레코드를 만들거나 편집할 때 사용자에게 표시되는 경고 또는 오류 메시지를 만들 수 있습니다. 시스템은 예약 규칙 preventDefault의 를 사용합니다. 따라서 onSaveevent에 결합된 비즈니스 프로세스 흐름 및 기타 사용자 지정 스크립트는 예약 규칙이 활성화된 예약 가능한 리소스 예약 엔터티에서 사용할 수 없습니다.
그러나 사용자가 비즈니스 프로세스 흐름을 사용할 수 있도록 아래 설정을 활성화하여 예약 양식 저장 시 예약 규칙 처리를 비활성화할 수 있습니다. 클라이언트 측 API를 사용하여 환경 수준에서 이 설정을 활성화할 수 있습니다.
msdyn_DisableProcessBookingRulesOnSaveBookingForm 설정의 현재 값 읽기.
Xrm.Utility.getGlobalContext().getCurrentAppSettings()["msdyn_DisableProcessBookingRulesOnSaveBookingForm"]
msdyn_DisableProcessBookingRulesOnSaveBookingForm 설정 활성화.
Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",true,).then(() => {a = "success"}, (error) => {a = error})
**msdyn_DisableProcessBookingRulesOnSaveBookingForm** 설정 비활성화.
Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",false,).then(() => {a = "success"}, (error) => {a = error})