次の方法で共有


予約ルールを設定する

Field Service の予約ルールでは、ユーザー設定の条件に基づいて、リソース予約レコードを作成または編集するときにユーザーに表示される警告またはエラー メッセージが作成されます。 たとえば、スケジュール ボードでジョブに必要な特性を持たないリソースに対して作業指示書を予約しようとしたときに、ユーザーに警告する予約ルールを作成できます。

予約ルールは、予約可能なリソース予約レコードが作成または編集される前に実行されるカスタム JavaScript メソッドです。 JavaScript メソッドは、作成される Bookable Resource Booking レコードの情報を含むパラメーターを受け取ることができ、必要なプロパティを持つ JavaScript オブジェクトを返す必要があります。

予約ルールを設定して、作成時または変更時に予約を検証します。

  • 予約ルールは、スケジュール ボードとスケジュール アシスタントの日単位、週単位、または月単位のビューではなく、時間単位のビューでのみ使用できます。 予約可能なリソース予約フォームで予約が作成または更新されたときに使用できます。
  • 予約ルールは、フォームで業務プロセス フローが有効になっている場合、予約可能なリソース予約フォームでは使用できません。
  • 予約ルールは、スケジュール ボードの再割り当て機能では使用できません。
  • 各カスタム予約ルールは、エラーまたは警告を 1 つだけ返すことができます。 複数のメッセージを返すには、検証ごとに個別の予約ルールを設定します。

ソリューションを作成する

カスタム JavaScript Web リソースを作成します。 カスタム JavaScript Web リソースを追加したり、カスタマイズに使用する既存のソリューションを使用したりするために、Microsoft Power Apps でソリューションを作成することをお勧めします。

  1. 予約ルール JavaScript Web リソースの新しいソリューションを作成します。 ソリューションでは、既定の発行元ではなく一意の発行元を使用することをお勧めします。

  2. ソリューションを作成したら、 新しい Web リソースを作成します

  3. 型として JavaScript (JS) を選択します。

  4. 予約ルールの JavaScript コードを入力します。

  5. 保存公開を選択します。

予約ルールを設定する

  1. フィールド サービスに移動し、[リソース] 領域を選択します。

  2. [ Booking Settings]\(予約設定\) で[ Booking Rules]\(予約ルール\) を選択し、[ 新規] を選択します。

    新しい予約ルールのスクリーンショット。

  3. 次の情報を入力してください。

    • 予約規則の名前。
    • 最近作成した Web リソース。
    • JavaScript で定義したメソッド名。
  4. 保存して閉じる を選択します。 予約ルールは、スケジュール ボードとスケジュール アシスタントまたはエンティティ フォームの時間単位ビューで使用されます。

予約ルールは、スケジュール ボードとスケジュール アシスタントの時間単位ビューでのみサポートされます。 予約ルールは、予約可能なリソース予約フォームを使用して予約が作成または更新されるときにもサポートされます。 予約ルールは、予約レコードの削除時には実行 されません 。 複数編集を使用する場合、予約ルールはフォームでは機能しません。 ルールの実行を停止するには、予約ルールを非アクティブ化します。

カスタム プロセス アクションを作成する

予約ルールの一部として検証を実行するカスタム プロセス アクションを作成します。 カスタム Web リソースの JavaScript で、カスタム プロセス アクションを呼び出し、アクションの結果を評価します。 サンプル コードに移動して、カスタム プロセス アクションを呼び出す方法を確認します。

カスタム Web リソースに対して定義したソリューションを使用して、カスタム プロセス アクションを追加することをお勧めします。

次の入力パラメーターと出力パラメーターを使用します。 シナリオで必要に応じて、入力パラメーターと出力パラメーターをさらに追加できます。 カスタム プロセス アクションを呼び出すために定義した JavaScript が、他の入力パラメーターと出力パラメーターをサポートするように更新されていることを確認する必要があります。

入力パラメーター:

  • originalScheduleStart – DateTime
  • originalScheduleEnd – DateTime
  • オリジナル予約可能リソース - エンティティ参照
  • originalScheduleSource – 候補リスト
  • newScheduleStart – DateTime
  • newScheduleEnd – DateTime
  • isCreate – ブール値
  • isUpdate – ブール値

出力パラメーター:

  • isError – ブール値
  • isWarning – ブール値
  • errorMessage – 文字列
  • 警告メッセージ - '文字列'

次のスクリーンショットは、カスタム プロセス アクションの例を示しています。 このサンプルでは、 newBookableResource が作業指示書の優先リソースと一致し、newScheduleStart約束した開始時間約束した終了時間 内にあるかどうかを確認します。 約束された期間の日付は単一の日付であると想定されています。 例: 約束した時刻の始まり: 2016年1月1日 午前8時 / 約束した時刻の終わり: 2016年1月1日 午後12時.

カスタム CRM アクションのスクリーンショット。

サンプル コード

作成した JavaScript 関数は、予約コンテキストと見なされる 1 つのパラメーターを受け取ることができます。 渡された予約コンテキスト パラメーターは、クライアント側スクリプトで使用される一般的な 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 コードを予約ルールのカスタム Web リソースに含める必要 はありません

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 コードを予約ルールのカスタム Web リソースに含める必要 はありません

    var ruleResult = {
    IsValid: false,
    Message: "Some Message Here",
    Type: "error" // this can be either "error" or "warning"
};

JavaScript 関数定義の例。 次の JavaScript コードは、カスタム Web リソースに含める必要がある唯一の 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})