Настройка правил резервирования

Правила резервирования в Field Service создают предупреждения или сообщения об ошибках, которые видят пользователи при создании или изменении записи резервирования ресурса в зависимости от настраиваемых условий. Например, правило резервирования можно создать, чтобы предупредить пользователя, который пытается зарезервировать заказ на работу для ресурса в таблице расписаний, у которого нет требуемых для задания навыков.

Правила резервирования являются настраиваемыми методами JavaScript, которые будут выполняться до создания или изменения записи резервирования резервируемого ресурса. Метод JavaScript может принимать параметр, который будет содержать данные для создаваемой записи "Резервирование резервируемого ресурса" и должен возвращать объект JavaScript с необходимыми свойствами.

Задайте правила резервирования для проверки резервирования, когда оно создается или изменяется.

Заметка

  • Правила резервирования доступны только для почасового представления, но не для ежедневных, еженедельных или ежемесячных представлений доски расписания и помощника по расписанию. Они также доступны при создании или обновлении резервирования через форму резервирования резервируемого ресурса.
  • Правила резервирования недоступны в форме резервирования резервируемого ресурса, если в форме включен поток бизнес-процесса.
  • Правила резервирования недоступны для функции переназначения в таблице расписания.
  • Каждое пользовательское правило резервирования может возвращать только одну ошибку/предупреждение. Чтобы вернуть несколько сообщений, настройте отдельные правила резервирования для каждой проверки.

Создание решения

Первым шагом к настройке правила резервирования является создание собственного веб-ресурса JavaScript. Мы рекомендуем вам создать решение в CRM для добавления собственного веб-ресурса JavaScript или использовать существующее решение, которое может быть у вас, для настройки.

Создание решения CRM

  1. В разделе Параметры>Решения создайте новое решение для веб-ресурсов JavaScript правил резервирования.

На следующем снимке экрана показано только что созданное решение. Мы рекомендуем использовать в вашем решении уникального издателя, а не издателя по умолчанию.

Снимок экрана с правилами резервирования для Field Service.

  1. После создания решения выберите компонент "Веб-ресурсы" и создайте новый веб-ресурс.
  2. В форме нового веб-ресурса введите следующие сведения: a. Имя b. Отображаемое имя c. Выберите тип Script (Jscript)
  3. Выберите вариант текстового редактора, чтобы ввести код JavaScript для правила резервирования.
  4. Выберите Сохранить, чтобы сохранить веб-ресурс.
  5. Выберите Опубликовать, чтобы убедиться, что веб-ресурс правила резервирования опубликован.

Снимок экрана нового веб-ресурса

Настройка правила резервирования

  1. В главном меню перейдите в раздел Field Service>Ресурсы, затем выберите Правила резервирования в разделе Параметры резервирования.

    Снимок экрана со списком активных правил резервирования в Field Service.

  2. Выберите +Создать, чтобы создать новое правило резервирования.

  3. В форме правила резервирования введите следующие сведения: a. Имя b. Веб-ресурс (выберите недавно созданный веб-ресурс). c. Введите имя метода, которое вы определили в своем JavaScript.

    Снимок экрана правил резервирования.

  4. Сохраните правило резервирования. После сохранения правила резервирования оно будет использоваться для почасового представления доски расписания и помощника по расписанию или формы сущности. Вы можете деактивировать запись правила резервирования, чтобы доска расписания, помощник по расписанию или форма сущности резервирования не выполняли правила.

Заметка

В настоящее время правила резервирования поддерживаются только в почасовом представлении доски расписания и помощника по расписанию. Правила резервирования также поддерживаются, когда резервирования создаются или обновляются с помощью формы резервирования резервируемых ресурсов. Правила резервирования не выполняют удаление записи резервирования. Правила резервирования не работают с формами при использовании мультиредактирования.

Создание действия CRM

В этом разделе мы рассмотрим пример, показывающий, как вы можете использовать настраиваемое действие CRM для выполнения проверки как части правила резервирования.

При использовании действия CRM для проверки правила резервирования вам все равно потребуется создать настраиваемый веб-ресурс, как определено выше. JavaScript, который вы определите в своем пользовательском веб-ресурсе, будет вызывать пользовательское действие CRM и оценивать результаты пользовательского действия CRM. См. Приложение A в конце этого документа, где приведен пример кода, который можно использовать для вызова пользовательского действия CRM.

В CRM необходимо создать пользовательское действие CRM. Мы рекомендуем вам использовать решение CRM, которое вы определили для своего настраиваемого веб-ресурса, чтобы добавить настраиваемое действие CRM.

Настраиваемое действие CRM должно иметь следующие входные и выходные параметры. Вы можете добавить больше входных и выходных параметров, как того требует ваш сценарий. Вам нужно будет убедиться, что JavaScript, который вы определяете для вызова своего настраиваемого действия CRM, обновлен для поддержки других параметров ввода и вывода.

Входные параметры:

  • originalScheduleStart – DateTime
  • originalScheduleEnd – DateTime
  • originalBookableResource – EntityReference
  • originalScheduleSource – Picklist
  • newScheduleStart – DateTime
  • newScheduleEnd – DateTime
  • isCreate – Boolean
  • isUpdate – Boolean

Выходные параметры:

  • isError – Boolean
  • isWarning – Boolean
  • errorMessage – String
  • warningMessage - String

На следующем снимке экрана показан пример настраиваемого действия CRM. В этом примере проверяется, совпадает ли newBookableResource с предпочитаемым ресурсом в заказе на работу и находится ли newScheduleStart в промежутке от Обещанное время начала до Обещанное время окончания. Предполагается, что даты обещанного окна указаны для одной даты. Пример. Обещанное время начала: 01.01.2016 08:00 / Обещанное время окончания: 01.01.2016 12:00.

Снимок экрана настраиваемого действия CRM.

Пример кода

Созданная вами функция JavaScript может принимать один параметр, который считается контекстом резервирования. Параметр, переданный в контексте резервирования, это не* типичный контекст CRM, используемый в клиентских сценариях.

Параметр контекста резервирования будет иметь следующее определение 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 в правилах бронирования. В результате потоки бизнес-процессов и другие пользовательские скрипты, связанные с событием onSave, не могут использоваться для сущности резервирования ресурсов, доступных для резервирования, с включенными правилами резервирования.

Однако обработку правил резервирования можно отключить при сохранении формы резервирования, включив приведенный ниже параметр, который позволит пользователям использовать потоки бизнес-процессов. 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})