Einrichten von Buchungsregeln

Buchungsregeln im Felddienst erstellen Warnungs- oder Fehlermeldungen, die Benutzern beim Erstellen oder Bearbeiten eines Ressourcenbuchungsdatensatzes basierend auf benutzerdefinierten Bedingungen angezeigt werden. So könnte beispielsweise eine Buchungsregel erstellt werden, um einen Benutzer zu warnen, wenn er versucht, eine Arbeitsbestellung in eine Ressource auf der Plantafel zu buchen, die nicht über die für den Auftrag erforderlichen Merkmale verfügt.

Buchungsregeln sind benutzerdefinierte JavaScript-Methoden, die ausgeführt werden, bevor der Datensatz "Bookable Resource Booking " erstellt oder bearbeitet wird. Die JavaScript-Methode kann einen Parameter akzeptieren, der Informationen für den zu erstellenden Bookable Resource Booking-Eintrag enthält und ein JavaScript-Objekt mit den erforderlichen Eigenschaften zurückgeben muss.

Richten Sie Buchungsregeln ein, um eine Buchung zu überprüfen, wenn sie erstellt oder geändert wird.

Notiz

  • Buchungsregeln sind nur für die stundenweise Ansicht und nicht für die tägliche, wöchentliche oder monatliche Ansicht der Zeitplantafel und des Planungsassistenten verfügbar. Sie sind verfügbar, wenn eine Buchung im buchbaren Ressourcenbuchungsformular erstellt oder aktualisiert wird.
  • Buchungsregeln sind im buchbaren Ressourcenbuchungsformular nicht verfügbar, wenn der Geschäftsprozessfluss auf dem Formular aktiviert ist.
  • Buchungsregeln sind für die Neuzuweisungsfunktion auf der Plantafel nicht verfügbar.
  • Jede benutzerdefinierte Buchungsregel kann nur einen Fehler oder eine Warnung zurückgeben. Um mehrere Nachrichten zurückzugeben, richten Sie einzelne Buchungsregeln für jede Überprüfung ein.

Lösung erstellen

Erstellen Sie eine benutzerdefinierte JavaScript-Webressource. Es wird empfohlen, eine Lösung in Microsoft Power Apps zu erstellen, um Ihre benutzerdefinierte JavaScript-Webressource hinzuzufügen oder eine vorhandene Lösung zu verwenden, die Sie für Anpassungen verwenden.

  1. Erstellen Sie eine neue Lösung für Ihre JavaScript-Webressourcen für die Buchungsregel. Es wird empfohlen, dass Ihre Lösung anstelle des Standardherausgebers einen eindeutigen Herausgeber verwendet.

  2. Erstellen Sie nach dem Erstellen der Lösung eine neue Webressource.

  3. Wählen Sie JavaScript (JS) als Typ aus.

  4. Geben Sie Ihren JavaScript-Code für die Buchungsregel ein.

  5. Wählen Sie Speichern und Veröffentlichen aus.

Einrichten einer Buchungsregel

  1. Wechseln Sie zum Felddienst , und wählen Sie den Bereich "Ressourcen " aus.

  2. Wählen Sie unter "Buchungseinstellungen" die Option "Buchungsregeln" und dann " Neu" aus.

    Screenshot einer neuen Buchungsregel.

  3. Geben Sie die folgenden Informationen ein:

    • Der Name der Buchungsregel.
    • Die Webressource, die Sie kürzlich erstellt haben.
    • Der Methodenname, den Sie in Ihrem JavaScript definiert haben.
  4. Wählen Sie Speichern & Schließen aus. Die Buchungsregel wird von der Stündlichen Ansicht der Zeitplantafel, dem Zeitplanassistenten oder dem Entitätsformular verwendet.

Notiz

Die Buchungsregeln werden nur in der stündlichen Ansicht des Planungsbretts und des Zeitplan-Assistenten unterstützt. Die Buchungsregeln werden auch unterstützt, wenn die Buchungen mithilfe des buchbaren Ressourcenbuchungsformulars erstellt oder aktualisiert werden. Buchungsregeln werden nicht beim Löschen eines Buchungsdatensatzes ausgeführt. Buchungsregeln funktionieren bei Verwendung von Mehrfachbearbeitungen nicht auf Formularen. Um die Ausführung der Regel zu beenden, deaktivieren Sie die Buchungsregel.

Eine benutzerdefinierte Prozessaktion erstellen

Erstellen Sie eine benutzerdefinierte Prozessaktion , um die Validierung als Teil einer Buchungsregel auszuführen. Rufen Sie im JavaScript Ihrer benutzerdefinierten Webressource die benutzerdefinierte Prozessaktion auf, und bewerten Sie die Ergebnisse aus der Aktion. Wechseln Sie zum Beispielcode , um zu sehen, wie eine benutzerdefinierte Prozessaktion aufgerufen wird.

Es wird empfohlen, die Lösung zu verwenden, die Sie für Ihre benutzerdefinierte Webressource definiert haben, um Ihre benutzerdefinierte Prozessaktion hinzuzufügen.

Verwenden Sie die folgenden Eingabe- und Ausgabeparameter. Sie können bei Bedarf weitere Eingabe- und Ausgabeparameter hinzufügen. Sie müssen sicherstellen, dass das JavaScript, das Sie zum Aufrufen ihrer benutzerdefinierten Prozessaktion definieren, aktualisiert wird, um Ihre anderen Eingabe- und Ausgabeparameter zu unterstützen.

Eingabeparameter:

  • originalerZeitplanStart – DateTime
  • originalScheduleEnd – DatumZeit
  • originalBookableResource – Entitätsreferenz
  • originalScheduleSource – Auswahlliste
  • newScheduleStart - Datum/Uhrzeit
  • neuerZeitplanEnde – DateTime
  • isCreate – Boolescher Wert
  • isUpdate – Boolescher Wert

Ausgabeparameter:

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

Der folgende Screenshot zeigt ein Beispiel für eine benutzerdefinierte Prozessaktion. In diesem Beispiel wird überprüft, ob die neueBookableResource der bevorzugten Ressource in der Arbeitsreihenfolge entspricht und ob sich der newScheduleStart innerhalb der Zeit von "Zugesagt " und " Zeit bis zugesagt" befindet. Es wird angenommen, dass die Datumsangaben des zugesagten Fensters für ein einzelnes Datum gelten. Beispiel: Versprochene Zeit von: 01.01.2016 8:00 Uhr / Versprochene Zeit bis: 01.01.2016 12:00 Uhr.

Screenshot einer benutzerdefinierten CRM-Aktion.

Beispielcode

Die von Ihnen erstellte JavaScript-Funktion kann einen einzelnen Parameter akzeptieren, der als Buchungskontext betrachtet wird. Der übergebene Buchungskontextparameter ist kein typischer CRM-Kontext, der in clientseitigen Skripts verwendet wird.

Buchungskontextschema:

export type BookingRuleContext = {
    oldValues: BookingRuleBookingRecord;
    newValues: BookingRuleBookingRecord;
    isCreate: boolean;
    isUpdate: boolean;
};
 
export type BookingRuleBookingRecord = {
    ResourceRequirementId?: string;
    ResourceId?: string;
    StartTime?: Date;
    EndTime?: Date;
    ResourceScheduleSource?: string;
};

Der Buchungskontextparameter hat die folgende JavaScript-Definition.

Notiz

Es ist nicht erforderlich, diesen JavaScript-Code in die benutzerdefinierte Webressource für die Buchungsregel einzuschließen.

Die möglichen Werte für ResourceScheduleSource stammen aus dem globalen Ressourcenplan-Quelloptionssatz. Sie können diese Eigenschaft verwenden, um zu wissen, ob die Buchungsregel von der Terminplan-Tafel oder vom Planungsassistent ausgelöst wird.

    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
    };

Die Validierungsmethode muss ein JavaScript-Objekt mit der folgenden Definition zurückgeben.

Notiz

Es ist nicht erforderlich, diesen JavaScript-Code in die benutzerdefinierte Webressource für die Buchungsregel einzuschließen.

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

Beispieldefinition der JavaScript-Funktion. Der folgende JavaScript-Code ist der einzige JavaScript-Code, den Sie in Ihre benutzerdefinierte Webressource einbeziehen müssen.


    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;
    }

Mit dem folgenden JavaScript können Sie eine benutzerdefinierte CRM-Aktion aufrufen, die dieselben Eingabe- und Ausgabeparameter wie im vorherigen Beispiel enthält.

Im Buchungsregeldatensatz muss der Methodenname folgendes sein: MSFSAENG. ScheduleBoard.Validate. Weitere Informationen finden Sie im Screenshot im Abschnitt "Einrichten einer Buchungsregel" in diesem Artikel.


    /// <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 = {}));

Weitere Hinweise

Die buchbare Ressourcenbuchung ist für die Verwendung von Buchungsregeln aktiviert, um Warnungen oder Fehlermeldungen zu erstellen, die Benutzern beim Erstellen oder Bearbeiten eines Ressourcenbuchungsdatensatzes basierend auf benutzerdefinierten Bedingungen angezeigt werden. Das System verwendet preventDefault in Buchungsregeln. Daher können Geschäftsprozessflüsse und andere benutzerdefinierte Skripts, die an das onSaveEreignis gebunden sind, nicht für die buchbare Ressourcenbuchungsentität verwendet werden, wobei Buchungsregeln aktiviert sind.

Die Verarbeitung von Buchungsregeln kann jedoch beim Speichern des Buchungsformulars deaktiviert werden, indem die nachstehende Einstellung aktiviert wird, wodurch die Benutzer die Geschäftsprozessabläufe verwenden können. Die clientseitigen APIs können verwendet werden, um diese Einstellung auf Umgebungsebene zu aktivieren.

Lesen Sie den aktuellen Wert der Einstellung msdyn_DisableProcessBookingRulesOnSaveBookingForm.

Xrm.Utility.getGlobalContext().getCurrentAppSettings()["msdyn_DisableProcessBookingRulesOnSaveBookingForm"]

Aktivieren Sie die Einstellung msdyn_DisableProcessBookingRulesOnSaveBookingForm.

Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",true,).then(() => {a = "success"}, (error) => {a = error})

Deaktivieren Sie die Einstellung **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",false,).then(() => {a = "success"}, (error) => {a = error})