Dela via


Ange bokningsregler

Bokningsregler i Field Service skapar varningar eller felmeddelanden som användare ser när de skapar eller redigerar en resursbokningspost, baserat på anpassade villkor. Exempelvis kan en bokningsregel skapas för att varna användaren när de försöker boka en arbetsorder till en resurs på schematavlan som inte har de färdigheter som krävs för jobbet.

Bokningsregler är anpassade JavaScript-metoder som körs innan bokningsposten för bokningsbara resurser skapas eller redigeras. JavaScript-metoden kan godkänna en parameter som innehåller information om den bokningspost för bokningsbar resurs som skapas och måste returnera ett JavaScript-objekt med de obligatoriska egenskaperna.

Ställ in regler för bokning för att validera en bokning när den skapas eller ändras.

Kommentar

  • Bokningsregler är endast tillgängliga för timvyn och inte vyerna per dag, vecka eller månad för schemaläggningstavla och schemaassistent. De är också tillgängliga när en bokning skapas eller uppdateras via ett bokningsbart resursbokningsformulär.
  • Bokningsregler är inte tillgängliga i det bokningsbara resursbokningsformuläret om det har affärsprocessflöde aktiverat i formuläret.
  • Bokningsregler är inte tillgängliga på omtilldelarfunktionen på schemaläggningstavlan.
  • Varje anpassad bokningsregel kan endast returnera ett fel/varning. För att returnera flera meddelanden, ställ in individuella bokningsregler för varje validering.

Skapa en lösning

Det första steget för att konfigurera en bokningsregel är att skapa en anpassad JavaScript-webbresurs. Vi rekommenderar att du skapar en lösning i CRM och lägger till en anpassad JavaScript-webbresurs eller använder en befintlig lösning som du kan ha för anpassningar.

Skapa CRM-lösning

  1. Från inställningar>lösningar skapar du en ny lösning för din bokningsregel JavaScript-webbresurser.

Följande skärmbild visar en nyligen skapad lösning. Vi rekommenderar att lösningen använder en unik utgivare i stället för standardutgivaren.

Skärmbild av bokningsreglerna för Field Service.

  1. När du har skapat lösningen väljer du komponenten för webbresurser och skapar en ny webbresurs.
  2. Ange följande information i webbresursformuläret a. Namn b. Visningsnamn c. Välj Script (Jscript) som Typ.
  3. Välj textredigeringsalternativet om du vill ange din JavaScript-kod för bokningsregeln.
  4. Välj Spara för att spara webbresursen.
  5. Välj publicera om du vill kontrollera att webbresursen för bokningsregeln har publicerats.

Skärmbild av en ny webbresurs

Skapa en bokningsregel

  1. Från huvudmenyn gå till Field Service>Resurser och välj sedan Bokningsregler under Bokningsinställningar.

    Skärmbild av aktiva bokningsregellistan i Field Service.

  2. Välj +Ny för att skapa en ny bokningsregel.

  3. I bokningsregelformuläret anger du följande information: a. Namn b. Webbresurs (välj den webbresurs du nyss skapat). c. Ange det metodnamn du har angett i JavaScript.

    Skärmbild av bokningsregeln.

  4. Spara bokningsregeln. När du har sparat bokningsregeln används den i timvyn av schemaläggningstavlan och schemaassistenten eller entitetsformuläret. Du kan inaktivera din bokningsregelpost om du vill att schemaläggningstavlan, schemaläggningsassistenten eller entitetsformuläret för bokning inte ska köra regeln.

Kommentar

Bokningsreglerna stöds för närvarande endast i timvyn av schemaläggningstavlan och schemaläggningsassistenten. Bokningsreglerna får också stöd när bokningar skapas eller uppdateras med hjälp av bokningsformuläret för bokningsbara resurser. Bokningsregler körs inte när en bokningspost tas bort. Bokningsregler fungerar inte i formulär med flera ändringar.

Skapa en CRM- åtgärd

I det här avsnittet visas ett exempel på hur du kan använda en anpassad CRM-åtgärd för att utföra valideringen som en del av en bokningsregel.

När du använder en CRM-åtgärd för valideringen av bokningsregler måste du fortfarande skapa en anpassad webbresurs enligt definitionen ovan. Det JavaScript som du definierar i den anpassade webbresursen kommer att anropa den anpassade CRM-åtgärden och utvärdera resultatet från den anpassade CRM-åtgärden. Se bifogad fil i slutet av det här dokumentet för exempelkod som du kan använda för att anropa en anpassad CRM-åtgärd.

En anpassad CRM-åtgärd måste skapas i CRM. Vi rekommenderar att du använder den CRM-lösning som du har definierat för den anpassade webbresursen för att lägga till din anpassade CRM-åtgärd.

Den anpassade CRM-åtgärden bör ha följande in- och utdata-parametrar. Du kan lägga till ytterligare indata- och utdataparametrar i takt med att scenariot kräver det. Du måste se till att JavaScript som du definierar för att anropa din anpassade CRM-åtgärd uppdateras till att stödja dina ytterligare in- och utdataparametrar.

Indataparametrar:

  • originalScheduleStart – DateTime
  • originalScheduleEnd – DateTime
  • originalBookableResource – EntityReference
  • originalScheduleSource – plocklista
  • newScheduleStart – DateTime
  • newScheduleEnd – DateTime
  • isCreate – boolesk
  • isUpdate – boolesk

Utdataparametrar:

  • isError – boolesk
  • isWarning – boolesk
  • errorMessage – sträng
  • warningMessage – sträng

Följande skärmbild visar ett exempel på en anpassad CRM-åtgärd. Detta exempel kontrollerar om newBookableResource överensstämmer med den önskade resursen på arbetsordern, samt om newScheduleStart befinner sig inom Tid från utlovat och Tid till utlovat. Det antas att datumen för det utlovade fönstret gäller ett enskilt datum. Exempel: Tid från utlovat: 2016-01-01 8:00 AM / Tid till utlovat: 2016-01-01 12:00 PM.

Skärmbild på en anpassad CRM-åtgärd.

Exempelkod

JavaScript-funktionen du skapade kan acceptera en enskild parameter, som betraktas som bokningskontext. Den skickade kontextparametern för bokning är inte en typisk CRM-kontext som används i skript på klientsidan.

Sammanhangsschema för bokning:

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

Följande JavaScript-definition används för bokningens kontextparameter.

Kommentar

Det är inte nödvändigt att ta med den här JavaScript-koden i den anpassade webbresursen för bokningsregeln.

De möjliga värdena för ResourceScheduleSource kommer från den globala alternativuppsättningen för schemaläggningskälla för resurser. Du kan använda den här egenskapen om du vill veta om bokningsregeln utlöses från schemaläggningstavlan eller schemaläggningsassistenten.

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

Din valideringsmetod måste returnera ett JavaScript-objekt med följande definition.

Kommentar

Det är inte nödvändigt att ta med den här JavaScript-koden i den anpassade webbresursen för bokningsregeln.

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

Definitionsexempel på JavaScript-funktion. Följande JavaScript-kod är den enda JavaScript-kod som du behöver ta med i den anpassade webbresursen.


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

Följande JavaScript kan användas för att anropa en anpassad CRM-åtgärd som har samma in- och utdataparametrar som i föregående exempel.

I bokningsregelposten måste metodnamn vara: MSFSAENG.ScheduleBoard.Validate. Om du vill ha en referens läser du skärmdumpen i avsnittet "skapa en bokningsregel" i den här artikeln.


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

Ytterligare kommentarer

Den bokningsbara resursbokningen är aktiverad för att använda bokningsreglerna för att skapa varnings- eller felmeddelanden som visas för användare när dessa skapar eller redigerar en resurspost för bokning, baserat på egna villkor. Systemet använder preventDefault i bokningsregler. Därför binder affärsprocessflöden och andra anpassade skript till onSavehändelsen kan inte användas på den bokningsbara resursbokningsenheten med bokningsregler aktiverade.

Bearbetningen av bokningsregler kan dock inaktiveras genom att spara formuläret Bokning genom att aktivera inställningen nedan, vilket gör att användarna kan använda affärsprocessflödena. Klient-API:er kan användas för att aktivera den här inställningen på miljönivå.

Läs det aktuella värdet för inställningen msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Aktivera inställningen msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Inaktivera inställningen **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

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