Oprette reservationsregler
Med reservationsregler i Field Service kan du oprette advarsels- eller fejlmeddelelser, som brugerne ser, når de opretter eller redigerer en ressourcereservationspost ud fra brugerdefinerede betingelser. For eksempel kan en reservationsregel oprettes for at advare en bruger, når brugeren forsøger at reservere en arbejdsordre til en ressource i det planlægningsområde, der ikke har de ønskede faglige færdigheder, der kræves til jobbet.
Reservationsregler er brugerdefinerede JavaScript-metoder, der udføres, før posten til reservation af reserverbare ressourcer oprettes eller redigeres. JavaScript-metoden kan acceptere en parameter, der indeholder oplysninger for posten Reservation af reserverbare ressourcer, der oprettes, og skal returnere et JavaScript-objekt med de påkrævede egenskaber.
Konfigurer reservationsregler for at validere en reservation, når den er oprettet eller ændret.
Bemærk
- Reservationsregler er kun tilgængelige for timevisningen og ikke daglige, ugentlige eller månedlige visninger af planlægningsområdet og planlægningsassistenten. De er også tilgængelige, når en reservation oprettes eller opdateres via reservationsformularen for ressourcer, der kan reserveres.
- Reservationsregler er ikke tilgængelige i reservationsformularen for reserverbare ressourcer, hvis forretningsprocesforløb er aktiveret i formularen.
- Reservationsregler er ikke tilgængelige i gentildelingsfunktionaliteten i planlægningsområdet.
- Hver brugerdefinerede reservationsregel kan kun returnere én fejl/advarsel. For at returnere flere beskeder skal du oprette individuelle reservationsregler for hver validering.
Opret en løsning
Det første trin i konfigurationen af reservationsreglen er at oprette en brugerdefineret JavaScript-webressource. Det anbefales, at du opretter en løsning i CRM for at tilføje din brugerdefinerede JavaScript-webressource eller bruger en eksisterende løsning, hvis du har en løsning til tilpasninger.
Opret CRM-løsning
- Opret en ny løsning til reservationsreglen i JavaScript-webressourcer fra Indstillinger>Løsninger.
På følgende skærmbillede vises en løsning, der netop er blevet oprettet. Vi anbefaler, at din løsning bruger en unik udgiver frem for standardudgiveren.
- Når løsningen er oprettet, skal du vælge komponenten Webressourcer og oprette en ny webressource.
- I den nye webressourceformular skal du angive følgende oplysninger: a. Navn b. Vist navn c. Vælg Script (Jscript) som typen.
- Vælg teksteditorindstillingen for at angive JavaScript-koden til reservationsreglen.
- Vælg Gem for at gemme din webressource.
- Vælg Udgiv for at sikre, at webressourcen for reservationsreglen er udgivet.
Oprette en reservationsregel
Gå til Field Service>Ressourcer fra hovedmenuen, og vælg derefter Reservationsregler under Reservationsindstillinger.
Vælg +Ny for at oprette en ny reservationsregel.
Fra reservationsregelformularen skal du angive følgende oplysninger: a. Navn b. Webressource (vælg den webressource, du netop har oprettet). c. Angiv det metodenavn, du definerede i JavaScript.
Gem din reservationsregel. Når du har gemt reservationsreglen, bruges den af timevisningen i planlægningsområdet og planlægningsassistenten eller objektformularen. Du kan deaktivere reservationsregelposten for at forhindre, at planlægningsområdet, planlægningsassistenten eller formularen for reservationsobjektet kører reglen.
Bemærk
Reservationsregler understøttes i øjeblikket kun i timevisningen i planlægningsområdet og planlægningsassistenten. Reservationsregler understøttes også, når reservationerne oprettes eller opdateres ved hjælp af reservationsformularen for den reserverbare ressource. Reservationsregler udføres ikke, når en reservationspost slettes. Reservationsregler fungerer ikke på formularer, når du bruger flere redigeringer.
Oprette en CRM-handling
I dette afsnit ser vi nærmere på et eksempel, der viser, hvordan du kan bruge en brugerdefineret CRM-handling til at udføre valideringen som en del af en reservationsregel.
Når du bruger en CRM-handling til validering af reservationsreglen, skal du stadig oprette en brugerdefineret webressource som defineret ovenfor. Det JavaScript, du definerer i din egen webressource, kalder den brugerdefinerede CRM-handling og evaluerer resultaterne fra den brugerdefinerede CRM-handling. Se den vedhæftede fil A i slutningen af dette dokument for at få vist eksempelkode, som du kan bruge til at kalde en brugerdefineret CRM-handling.
Der skal oprettes en brugerdefineret CRM-handling i CRM. Det anbefales, at du bruger den CRM-løsning, du har defineret til din egen webressource, til at tilføje den brugerdefinerede CRM-handling.
Den brugerdefinerede CRM-handling skal have følgende input- og outputparametre. Du kan tilføje yderligere input- og outputparametre, alt efter hvad der kræves i scenariet. Du skal sikre dig, at det JavaScript, du definerer for at kalde den brugerdefinerede CRM-handling, er opdateret, så den understøtter dine andre input- og outputparametre.
Inputparametre:
- originalScheduleStart – DateTime
- originalScheduleEnd – DateTime
- originalBookableResource – EntityReference
- originalScheduleSource – valgliste
- newScheduleStart – DateTime
- newScheduleEnd – DateTime
- isCreate – boolesk
- isUpdate – boolesk
Outputparametre:
- isError – boolesk
- isWarning – boolesk
- errorMessage – Streng
- warningMessage – Streng
På følgende skærmbillede vises et eksempel på en brugerdefineret CRM-handling. Dette eksempel kontrollerer, om newBookableResource stemmer overens med den foretrukne ressource i arbejdsordren, og om newScheduleStart er inden for Tid fra bekræftet og Tid til bekræftet. Det antages, at datoerne i bekræftet-vinduet er for en enkelt dato. Eksempel: Tid fra bekræftet: 01-01-2016 8:00/Tid til bekræftet: 01-01-2016 12:00.
Eksempelkode
Den JavaScript-funktion, du har oprettet, kan acceptere en enkelt parameter, som anses for at være reservationskonteksten. Den overførte parameter for reservationskonteksten er ikke en typisk CRM-kontekst for scripts på klientsiden.
Kontekstskema for reservation:
export type BookingRuleContext = {
oldValues: BookingRuleBookingRecord;
newValues: BookingRuleBookingRecord;
isCreate: boolean;
isUpdate: boolean;
};
export type BookingRuleBookingRecord = {
ResourceRequirementId?: string;
ResourceId?: string;
StartTime?: Date;
EndTime?: Date;
ResourceScheduleSource?: string;
};
Parameteren for reservationskontekst har følgende JavaScript-definition.
Bemærk
Det er ikke nødvendigt at inkludere denne JavaScript-kode i den brugerdefinerede webressource for reservationsreglen.
De mulige værdier for ResourceScheduleSource er fra den globale grupperede indstillings kilde til ressourceplan. Du kan bruge denne egenskab til at finde ud af, om reservationsreglen udløses fra planlægningsområdet eller planlægningsassistenten.
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
};
Valideringsmetoden skal returnere et JavaScript-objekt med følgende definition.
Bemærk
Det er ikke nødvendigt at inkludere denne JavaScript-kode i den brugerdefinerede webressource for reservationsreglen.
var ruleResult = {
IsValid: false,
Message: "Some Message Here",
Type: "error" // this can be either "error" or "warning"
};
Eksempel på en JavaScript-funktionsdefinition. Følgende JavaScript-kode er den eneste JavaScript-kode, du skal inkludere i den brugerdefinerede webressource.
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ølgende JavaScript kan bruges til at kalde en brugerdefineret CRM-handling, der har de samme input- og outputparametre som i forrige eksempel.
I posten for reservationsreglen skal Metodenavn være: MSFSAENG.ScheduleBoard.Validate. Du kan finde oplysninger ved at gå til skærmbilledet i afsnittet "Konfiguration af en reservationsregel" i denne 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 = {}));
Yderligere noter
Reservationen af reserverbare ressourcer kan bruge reservationsregler for at oprette advarsler eller fejlmeddelelser, som brugerne ser, når de opretter eller redigerer en ressourcereservationspost, ud fra brugerdefinerede betingelser. Systemet bruger preventDefault
i reservationsregler. Derfor kan forretningsprocesforløb og andre tilpassede scripts forbindes til onSave
hændelsen ikke bruges på det reserverbare ressourcebookingsobjekt, hvor reservationsregler er aktiveret.
Behandlingen af reservationsregler kan dog deaktiveres, når du gemmer formularen Reservation, ved at aktivere nedenstående indstilling, som vil give brugerne mulighed for at bruge forretningsprocesforløbet. API'er på klientsiden kan bruges til at aktivere denne indstilling på miljøniveau.
Læs den aktuelle værdi for indstillingen msdyn_DisableProcessBookingRulesOnSaveBookingForm
.
Xrm.Utility.getGlobalContext().getCurrentAppSettings()["msdyn_DisableProcessBookingRulesOnSaveBookingForm"]
Aktiver indstillingen msdyn_DisableProcessBookingRulesOnSaveBookingForm
.
Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",true,).then(() => {a = "success"}, (error) => {a = error})
Deaktiver indstillingen **msdyn_DisableProcessBookingRulesOnSaveBookingForm**
.
Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",false,).then(() => {a = "success"}, (error) => {a = error})