Partager via


Configurer les règles de réservation

Les règles de réservation dans Field Service permettent de créer un avertissement ou des messages d’erreur que les utilisateurs voient lors de la création ou de la modification d’un enregistrement de réservation de ressources, selon des conditions personnalisées. Par exemple, une règle de réservation peut être créée pour avertir un utilisateur lorsqu’il tente d’inscrire un ordre de travail d’une ressource sur le tableau de bord de planification qui ne dispose pas des compétences requises pour le travail.

Les règles de réservation sont des méthodes JavaScript personnalisées qui seront exécutées avant que l’enregistrement Réservation de ressources pouvant être réservées ne soit créé ou modifié. La méthode JavaScript peut accepter un paramètre qui contiendra les informations de l’enregistrement Réservation de ressources pouvant être réservées créé. Elle doit renvoyer un objet JavaScript avec les propriétés requises.

Définissez les règles de réservation pour valider une réservation lors de sa création ou de se modification.

Remarque

  • Les règles de réservation ne sont disponibles que pour la vue horaire, et non pour les vues quotidiennes, hebdomadaires ou mensuelles du tableau de planification et de l’Assistant Planifier. Elles sont également disponibles lorsqu’une réservation est créée ou mise à jour au moyen du formulaire de réservation de ressources réservables.
  • Les règles de réservation ne sont pas disponibles sur le formulaire de réservation de ressources réservables, si le flux des processus d’entreprise est activé sur le formulaire.
  • Les règles de réservation ne sont pas disponibles sur la fonctionnalité de réaffectation du tableau de planification.
  • Chaque règle de réservation personnalisée ne peut renvoyer qu’une seule erreur/avertissement. Pour renvoyer plusieurs messages, configurez des règles de réservation individuelles pour chaque validation.

Créer une solution

La première étape pour configurer votre règle de réservation consiste à créer une ressource Web JavaScript personnalisée. Nous vous recommandons de créer une solution dans CRM pour ajouter votre ressource Web JavaScript personnalisée ou d’utiliser une éventuelle solution existante pour effectuer des personnalisations.

Créer une solution CRM

  1. À partir de Paramètres>Solutions, créez une nouvelle solution pour vos ressources Web JavaScript de règle de réservation.

La capture d’écran suivante illustre une solution nouvellement créée. Nous vous recommandons que votre solution utilise un éditeur exclusif plutôt que l’éditeur par défaut.

Capture d’écran des règles de réservation pour Field Service.

  1. Après avoir créé la solution, sélectionnez le composant Ressources Web et créez une ressource Web.
  2. Dans le nouveau formulaire de ressource Web, entrez les informations suivantes :: a. Nom b. Nom d’affichage c. Sélectionnez Script (Jscript) comme type
  3. Sélectionnez l’option d’éditeur de texte pour entrer votre code JavaScript pour la règle de réservation.
  4. Sélectionnez Enregistrer pour enregistrer votre ressource web.
  5. Sélectionnez Publier pour vous assurer que votre ressource Web de règle de réservation a été publiée.

Capture d’écran d’une nouvelle ressource Web.

Configurer une règle de réservation

  1. Dans le menu principal, accédez à Field Service>Ressources, puis sélectionnez Règles de réservation sous Paramètres de réservation.

    Capture d’écran des règles de réservation actives répertoriées dans Field Service.

  2. Sélectionnez +Nouveau pour créer une règle de réservation.

  3. Dans le formulaire de règle de réservation, entrez les informations suivantes : a. Nom b. Ressource Web (Sélectionnez la ressource Web que vous avez récemment créée). c. Entrez le nom de la méthode que vous avez définie dans votre JavaScript.

    Capture d’écran des règles de réservation.

  4. Enregistrez votre règle de réservation. Une fois que vous avez enregistré la règle de réservation, elle sera utilisée par la vue horaire du tableau de planification et de l’Assistant Planifier ou par le formulaire d’entité. Vous pouvez désactiver votre enregistrement de règle de réservation pour empêcher le tableau de planification, l’Assistant Planifier ou le formulaire d’entité de réservation d’exécuter la règle.

Remarque

Les règles de réservation ne sont actuellement prises en charge que sur la vue horaire du tableau de planification et de l’Assistant Planifier. Les règles de réservation sont également prises en charge lorsque les réservations sont créées ou mises à jour à l’aide du formulaire de réservation de ressources réservables. Les règles de réservation ne s’exécutent pas lors de la suppression d’un enregistrement de réservation. Les règles de réservation ne fonctionnent pas sur les formulaires lors de l’utilisation de la modification multiple.

Créer une action CRM

Dans cette section, nous allons observer un exemple de la manière d’utiliser une action CRM personnalisée pour opérer les validations dans le cadre d’une règle de réservation.

Lorsque vous utilisez une action CRM pour la validation de la règle de réservation, vous devez encore créer une ressource Web personnalisée comme défini ci-dessus. Le Javascript que vous définirez dans votre ressource Web personnalisée appellera l’action CRM personnalisée et évaluera les résultats de l’action CRM personnalisée. Consultez l’annexe A à la fin de ce document pour voir des exemples de code que vous pouvez utiliser pour appeler une action CRM personnalisée.

Une action CRM personnalisée doit être créée dans CRM. Nous vous recommandons d’utiliser la solution CRM que vous avez définie pour votre ressource Web personnalisée pour ajouter votre action CRM personnalisée.

L’action CRM personnalisée doit avoir les paramètres suivants d’entrée et de sortie. Vous pouvez ajouter d’autres paramètres d’entrée et de sortie comme votre scénario l’exige. Vous devez veiller à ce que le Javascript que vous définissez pour appeler votre action CRM personnalisée soit mis à jour de manière à prendre en charge vos autres paramètres d’entrée et de sortie.

Paramètres d’entrée :

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

Paramètres de sortie :

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

Le capture d’écran suivante montre un exemple d’action CRM personnalisée. Cet exemple vérifie si la nouvelle ressource réservable newBookableResource correspond à la ressource préférée de l’ordre de travail, et si le départ de la nouvelle planification newScheduleStart se trouve entre le Temps écoulé depuis la promesse et le Temps jusqu’à la promesse. On suppose que les dates de la fenêtre de promesse ont la même date une seule date. Exemple : Temps écoulé depuis la promesse : 01/01/2016 8h00 / Temps jusqu’à la promesse : 01/01/2016 12h00.

Capture d’écran d’une action CRM personnalisée.

Exemple de code

La fonction JavaScript que vous avez créée ne peut accepter qu’un seul paramètre, qui est considéré comme le contexte de réservation. Le paramètre de contexte de réservation passé n’est pas un contexte CRM typique utilisé dans les scripts côté client.

Schéma du contexte de réservation :

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

Le paramètre de contexte de réservation aura la définition JavaScript suivante.

Remarque

Il n’est pas nécessaire d’inclure ce code JavaScript dans la ressource Web personnalisée pour la règle de réservation.

Les valeurs possibles de ResourceScheduleSource du groupe d’options général Source de planification des ressources. Vous pouvez vous servir de cette propriété pour savoir si la règle de réservation est déclenchée à partir du tableau de planification ou de l’Assistant Planifier.

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

Votre méthode de validation doit renvoyer un objet JavaScript avec la définition suivante.

Remarque

Il n’est pas nécessaire d’inclure ce code JavaScript dans la ressource Web personnalisée pour la règle de réservation.

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

Exemple de définition de fonction JavaScript. Le code JavaScript suivant est le seul code JavaScript vous devrez ajouter à votre ressource Web personnalisée.


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

Le Javascript suivant peut être utilisé pour appeler une action CRM personnalisée qui a les mêmes paramètres d’entrée et de sortie que l’exemple précédent.

Dans l’enregistrement de la règle de réservation, le Nom de la méthode doit être : MSFSAENG.ScheduleBoard.Validate. Pour référence, consultez la capture d’écran dans la section « Configuration d’une règle de réservation » de cet article.


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

Notes supplémentaires

La réservation de ressources pouvant être réservées est activer pour utiliser des règles de réservation, afin de créer un avertissements ou des messages d’erreur que les utilisateurs voient lors de la création ou de la modification d’un enregistrement de réservation de ressources, selon des conditions personnalisées. Le système utilise preventDefault dans les règles de réservation. Par conséquent, les flux de processus métier et autres liens scripts personnalisés à l’événement onSavene peuvent pas être utilisés sur l’entité de réservation de ressource réservable avec les règles de réservation activées.

Cependant, le traitement des règles de réservation peut être désactivé lors de l’enregistrement du formulaire Réservation en activant le paramètre ci-dessous, ce qui permet aux utilisateurs d’utiliser les flux de processus métier. Des API côté client peuvent être utilisées pour activer ce paramètre au niveau de l’environnement.

Lire la valeur actuelle du paramètre msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Activer le paramètre msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Désactiver le paramètre **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

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