Delen via


Boekingsregels instellen

Met boekingsregels in Field Service worden waarschuwings- of foutberichten gemaakt die gebruikers zien bij het maken of bewerken van een resourceboekingsrecord, op basis van aangepaste voorwaarden. Zo kan bijvoorbeeld een boekingsregel worden gemaakt om een gebruiker te waarschuwen als deze probeert een werkorder te boeken voor een resource op het planbord, die niet de gewenste vaardigheden heeft die de taak vereist.

Boekingsregels zijn aangepaste JavaScript-methoden die worden uitgevoerd voordat de record Boekbare resource boeken wordt gemaakt of bewerkt. De JavaScript-methode kan een parameter accepteren met informatie voor de record Boekbare resource boeken die wordt gemaakt en moet een JavaScript-object met de vereiste eigenschappen retourneren.

Configureer boekingsregels om een boeking te valideren wanneer deze wordt gemaakt of gewijzigd.

Opmerking

  • Boekingsregels zijn alleen beschikbaar voor de uurweergave en niet voor dagelijkse, wekelijkse of maandelijkse weergaven van het planbord en de planningsassistent. Ze zijn ook beschikbaar wanneer een boeking wordt gemaakt of bijgewerkt via het boekingsformulier voor boekbare resources.
  • Boekingsregels zijn niet beschikbaar op het boekingsformulier voor boekbare resoruces als bedrijfsprocesstroom is ingeschakeld op het formulier.
  • Boekingsregels zijn niet beschikbaar voor de functie voor opnieuw toewijzen op het planbord.
  • Elke aangepaste boekingsregel kan maar één fout/waarschuwing retourneren. Als u meerdere berichten wilt retourneren, stelt u voor elke validatie individuele boekingsregels in.

Een oplossing maken

De eerste stap bij het instellen van uw boekingsregel is het maken van een aangepaste JavaScript-webresource. We raden u aan een oplossing in CRM te maken om uw aangepaste JavaScript-webresource toe te voegen of een bestaande oplossing te gebruiken die u mogelijk hebt voor aanpassingen.

CRM-oplossing maken

  1. Maak via Instellingen>Oplossingen een nieuwe oplossing voor de JavaScript-webresources van uw boekingsregel.

De volgende schermopname toont een nieuw gemaakte oplossing. Uw oplossing kan het beste een unieke uitgever gebruiken in plaats van de standaarduitgever.

Schermopname van boekingsregels voor Field Service.

  1. Selecteer na het maken van de oplossing de component Webresources en maak een nieuwe webresource.
  2. Voer de volgende gegevens in het webresourceformulier in: a. Naam b. Weergavenaam c. Selecteer Script (Jscript) als het type
  3. Selecteer de teksteditor om uw JavaScript-code voor de boekingsregel in te voeren.
  4. Selecteer Opslaan om uw webresource op te slaan.
  5. Selecteer Publiceren om ervoor te zorgen dat de webresource voor de boekingsregel wordt gepubliceerd.

Schermopname van een nieuwe resource.

Een boekingsregel instellen

  1. Ga in het hoofdmenu naar Field Service>Resources en kies vervolgens Boekingsregels onder Boekingsinstellingen.

    Schermopname van lijst met actieve boekingsregels in Field Service.

  2. Selecteer +Nieuw om een nieuwe boekingsregel te maken.

  3. Voer vanuit het formulier Boekingsregel de volgende informatie in: a. Naam b. Webresource (selecteer de webresource die u onlangs hebt gemaakt). c. Voer de naam van de methode in die u in uw JavaScript hebt gedefinieerd.

    Schermopname van de boekingsregels.

  4. Sla de boekingsregel op. Nadat u de boekingsregel hebt opgeslagen, wordt deze gebruikt door de uurweergave van het planbord en de planningsassistent of het entiteitsformulier. U kunt uw boekingsregelrecord deactiveren om te voorkomen dat het planbord, de planningsassistent of het boekingsentiteitsformulier de regel uitvoert.

Opmerking

De boekingsregels worden momenteel alleen ondersteund in de uurweergave van het planbord en de planningsassistent. De boekingsregels worden ook ondersteund wanneer de boekingen worden gemaakt of bijgewerkt met behulp van het boekingsformulier voor boekbare resources. Boekingsregels worden niet uitgevoerd bij het verwijderen van een boekingsrecord. Boekingsregels werken niet op formulieren bij gebruik van meerdere bewerkingen.

Een CRM-actie maken

In dit gedeelte bekijken we een voorbeeld dat laat zien hoe u een aangepaste CRM-actie kunt gebruiken om de validatie uit te voeren als onderdeel van een boekingsregel.

Wanneer u een CRM-actie gebruikt voor de validatie van de boekingsregel, moet u nog steeds een aangepaste webresource maken, zoals hierboven wordt gedefinieerd. Het JavaScript dat u in uw aangepaste webresource definieert, roept de aangepaste CRM-actie aan en evalueert de resultaten van de aangepaste CRM-actie. Zie bijlage A aan het einde van dit document voor voorbeeldcode die u kunt gebruiken om een aangepaste CRM-actie aan te roepen.

U moet een aangepaste CRM-actie maken in CRM. We raden u aan de CRM-oplossing te gebruiken die u hebt gedefinieerd voor uw aangepaste webresource om uw aangepaste CRM-actie toe te voegen.

De aangepaste CRM-actie moet de volgende invoer- en uitvoerparameters hebben. U kunt nog meer invoer- en uitvoerparameters toevoegen als uw scenario dit vereist. U moet ervoor zorgen dat het gedefinieerde JavaScript voor het aanroepen van uw aangepaste CRM-actie, wordt bijgewerkt om uw andere invoer- en uitvoerparameters te ondersteunen.

Invoerparameters:

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

Uitvoerparameters:

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

De volgende schermopname toont een voorbeeld van een aangepaste CRM-actie. In dit voorbeeld wordt gecontroleerd of de newBookableResource overeenkomt met de voorkeursresource op de werkorder en of de newScheduleStart binnen de Tijd vanaf beloofd en Tijd tot beloofd valt. Er wordt van uitgegaan dat de datums van het beloofde venster voor één datum zijn. Voorbeeld: Tijd vanaf beloofd: 01-01-2016 08:00 uur / Tijd tot beloofd: 01-01-2016 12:00 uur.

Schermopname van een aangepaste CRM-actie.

Voorbeeldcode

De JavaScript-functie die u hebt gemaakt, kan een enkele parameter accepteren, die wordt beschouwd als de boekingscontext. De doorgegeven parameter voor de boekingscontext is niet een typische CRM-context die wordt gebruikt bij scripting aan de clientzijde.

Schema voor boekingscontext:

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

De parameter voor de boekingscontext heeft de volgende JavaScript-definitie.

Opmerking

Het is niet nodig om deze JavaScript-code op te nemen in de aangepaste webresource voor de boekingsregel.

De mogelijke waarden voor ResourceScheduleSource komen uit de algemene optieset van de resourceplanningsbron. U kunt van deze eigenschap gebruikmaken om te weten of de boekingsregel wordt geactiveerd door het planbord of de planningsassistent.

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

Uw validatiemethode moet een JavaScript-object met de volgende definitie retourneren.

Opmerking

Het is niet nodig om deze JavaScript-code op te nemen in de aangepaste webresource voor de boekingsregel.

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

Voorbeeld van JavaScript-functiedefinitie. De volgende JavaScript-code is de enige JavaScript-code die u in uw aangepaste webresource moet opnemen.


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

Het volgende JavaScript kan worden gebruikt om een aangepaste CRM-actie aan te roepen die dezelfde invoer- en uitvoerparameters heeft als het vorige voorbeeld.

In de boekingsregelrecord moet Methodenaam de volgende waarde hebben: MSFSAENG.ScheduleBoard.Validate. Zie ter referentie de schermopname in het gedeelte "Een boekingsregel instellen" van dit 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 = {}));

Aanvullende opmerkingen

De boeking van boekbare resources kan boekingsregels gebruiken om waarschuwingen of foutberichten te genereren die gebruikers zien bij het maken of bewerken van een resourceboekingsrecord, op basis van aangepaste voorwaarden. Het systeem gebruikt preventDefault in boekingsregels. Als gevolg hiervan kunnen bedrijfsprocesstromen en andere aangepaste scripts die aan de onSave-gebeurtenis zijn verbonden niet worden gebruikt voor de boekingsentiteit voor boekbare resources als boekingsregels zijn ingeschakeld.

De verwerking van boekingsregels kan echter worden uitgeschakeld bij het opslaan van het formulier Boekingen door de onderstaande instelling in te schakelen waardoor de gebruikers de bedrijfsprocesstromen kunnen gebruiken. De API's aan de clientzijde kunnen worden gebruikt om deze instelling op omgevingsniveau in te schakelen.

Lees de huidige waarde van de instelling msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Schakel de instelling msdyn_DisableProcessBookingRulesOnSaveBookingForm in.

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

Schakel de instelling **msdyn_DisableProcessBookingRulesOnSaveBookingForm** uit.

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