Partajați prin


Configurați regulile de rezervare

Regulile de rezervare din Field Service creează mesaje de avertizare sau de eroare pe care utilizatorii le văd atunci când creează sau editează o înregistrare de rezervare a resurselor, pe baza condițiilor personalizate. De exemplu, o regulă de rezervare ar putea fi creată pentru a avertiza un utilizator atunci când încearcă să rezerve în tabloul de planificare o comandă de lucru pentru o resursă care nu are aptitudinile necesare pentru activitate.

Regulile de rezervare sunt metode JavaScript particularizate care vor fi executate înainte de crearea sau modificarea înregistrării rezervare resursă ce se poate rezerva. Metoda JavaScript poate accepta un parametru care va conține informații pentru înregistrarea Rezervare resursă ce se poate rezerva care este creată și trebuie să returneze un obiect JavaScript cu proprietățile necesare.

Configurați regulile de rezervare pentru a valida o rezervare atunci când este creată sau modificată.

Notă

  • Regulile de rezervare sunt disponibile numai pentru vizualizarea orară, și nu vizualizările zilnice, săptămânale sau lunare ale tabloului de planificare și ale asistentului de planificare. Acestea sunt, de asemenea, disponibile atunci când o rezervare este creată sau actualizată prin intermediul formularului de rezervare a resurselor rezervabile.
  • Regulile de rezervare nu sunt disponibile în formularul de rezervare a resurselor rezervabile, dacă flux de business este activat în formular.
  • Regulile de rezervare nu sunt disponibile pe funcționalitatea de reasignare de pe tabloul de programare.
  • Fiecare regulă de rezervare personalizată poate returna o singură eroare/avertisment. Pentru a returna mai multe mesaje, configurați reguli individuale de rezervare pentru fiecare validare.

Creați o soluție

Primul pas în configurarea regulii de rezervare este crearea unei resurse web JavaScript personalizate. Vă recomandăm să creați o soluție în CRM pentru a adăuga resursa web personalizată JavaScript sau să utilizați o soluție existentă pe care o puteți avea pentru personalizări.

Creați soluția CRM

  1. Din Setări>Soluții, creați o nouă soluție pentru resursele web JavaScript pentru regulile de rezervare.

Următoarea captură de ecran arată o soluție nou creată. Vă recomandăm ca soluția dvs. să utilizeze mai degrabă un editor unic decât editorul implicit.

Captură de ecran a regulilor de rezervare pentru Field Service.

  1. După crearea soluției, selectați componenta Resurse web și creați o nouă resursă web.
  2. În noul formular de resurse web, introduceți următoarele informații: a. Nume b. Nume afișat c. Selectați Script (Jscript) ca tip
  3. Selectați opțiunea de editor de text pentru a introduce codul JavaScript pentru regula de rezervare.
  4. Selectați Salvare pentru a vă salva resursa web.
  5. Selectați Publicare pentru a vă asigura că resursa web pentru regulile de rezervare a fost publicată.

Captură de ecran a unei noi resurse web.

Configurați o reguă de rezervare

  1. Din meniul principal, accesați Field Service>Resurse, apoi alegeți Reguli de rezervare sub Setări de rezervare.

    Captură de ecran a listei de reguli de rezervare active în Field Service.

  2. Selectați +Nou pentru a crea o nouă regulă de rezervare.

  3. Din formularul regula de rezervare introduceți următoarele informații: a. Nume b. Resursă web (selectați resursa web pe care ați creat-o recent). c. Introduceți numele metodei pe care ați definit-o în JavaScript.

    Captură de ecran a regulilor de rezervare.

  4. Salvați regula de rezervare. Odată ce salvați regula de rezervare, aceasta va fi utilizată de vizualizarea orară a tabloului de planificare și a asistentului de planificare sau a formularului de entitate. Puteți să dezactivați înregistrarea regulii de rezervare pentru a menține tabloul de planificare, asistentul de planificare sau formularul entității de rezervare, de la executarea regulii.

Notă

În prezent, regulile de rezervare sunt acceptate numai în vizualizarea orară a tabloului de planificare și a asistentului de planificare. Regulile de rezervare sunt, de asemenea, acceptate atunci când rezervările sunt create sau actualizate utilizând formularul de rezervare a resurselor rezervabile. Regulile de rezervare nu se execută la ștergerea unei înregistrări de rezervare. Regulile de rezervare nu funcționează pe formulare când se utilizează editarea multiplă.

Creare o acțiune CRM

În această secțiune, vom analiza un exemplu care arată cum puteți utiliza o acțiune CRM personalizată pentru a efectua validarea ca parte a unei reguli de rezervare.

Când utilizați o acțiune CRM pentru validarea regulii de rezervare, va trebui în continuare să creați o resursă web personalizată, așa cum este definită mai sus. JavaScript pe care îl veți defini în resursa dvs. web personalizată va apela acțiunea CRM personalizată și va evalua rezultatele din acțiunea CRM personalizată. Consultați atașamentul A la sfârșitul acestui document pentru codul de probă pe care îl puteți utiliza pentru a apela o acțiune CRM particularizată.

O acțiune CRM particularizată va trebui creată în CRM. Vă recomandăm să utilizați soluția CRM pe care ați definit-o pentru resursa dvs. web personalizată pentru a adăuga acțiunea dvs. CRM personalizată.

Acțiunea CRM particularizată ar trebui să aibă următorii parametri de intrare și ieșire. Puteți adăuga mai mulți parametri de intrare și de ieșire, după cum necesită scenariul dvs. Va trebui să vă asigurați că JavaScript pe care îl definiți pentru a apela acțiunea dvs. personalizată CRM este actualizat pentru a accepta ceilalți parametri de intrare și ieșire.

Parametri de intrare:

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

Parametri de ieșire:

  • isError – Boolean
  • isWarning – Boolean
  • errorMessage – Șir
  • warningMessage - Șir

Următoarea captură de ecran arată un exemplu de acțiune CRM personalizată. Acest exemplu verifică dacă newBookableResource se potrivește cu resursa preferată din comanda de lucru și dacă newScheduleStart se află în interior din Timpul de la promis și Timpul de la promis. Se presupune că datele ferestrei promise sunt pentru o singură dată. Exemplu: Timp de la ora promisă: 01/01/2016 8:00 AM / Timp până la ora promisă: 01/01/2016 12:00 PM.

Captură de ecran a unei acțiuni CRM personalizate.

Cod eșantion

Funcția JavaScript pe care ați creat-o poate accepta un singur parametru, care este considerat contextul rezervării. Parametrul de context de rezervare transmis nu este un context CRM obișnuit utilizat în scripting-ul pe partea clientului.

Schema contextului rezervării:

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

Parametrul contextului de rezervare va avea următoarea definiție JavaScript.

Notă

Nu este nu necesar să includeți acest cod JavaScript în resursa web personalizată pentru regula de rezervare.

Valorile posibile pentru ResourceScheduleSource provin din sursa globală de planificare a resurselor set de opțiuni. Puteți folosi această proprietate pentru a ști dacă regula de rezervare este declanșată de la tabloul de planificare sau asistentul de Planificare.

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

Metoda de validare trebuie să returneze un obiect JavaScript cu următoarea definiție.

Notă

Nu este nu necesar să includeți acest cod JavaScript în resursa web personalizată pentru regula de rezervare.

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

Exemplu de definiție de funcție JavaScript. Următorul cod JavaScript este singurul cod JavaScript pe care va trebui să îl includeți în resursa dvs. web personalizată.


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

Următorul JavaScript poate fi folosit pentru a apela o acțiune CRM personalizată care are aceiași parametri de intrare și ieșire precum eșantionul anterior.

În înregistrarea regulii de rezervare, Numele metodei trebuie să fie: MSFSAENG.ScheduleBoard.Validate. Pentru referință, consultați captura de ecran din secțiunea „Configurarea unei reguli de rezervare” din acest articol.


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

Note suplimentare

Rezervarea resurselor rezervabile este activată să folosească regulile de rezervare pentru a crea avertismente sau mesaje de eroare pe care utilizatorii le văd atunci când creează sau editează o înregistrare de rezervare a resurselor, pe baza unor condiții personalizate. Sistemul folosește preventDefault în regulile de rezervare. Prin urmare, fluxurile de procese de afaceri și alte scripturi personalizate se leagă de evenimentul onSavenu pot fi utilizate în entitatea de rezervare a resurselor rezervabile cu regulile de rezervare activate.

Însă procesarea regulilor de rezervare poate fi dezactivată la salvarea formularului de rezervare prin activarea setării de mai jos, care ar permite utilizatorilor să utilizeze fluxurile de business. API-urile de pe client pot fi utilizate pentru a activa această setare la nivel de mediu.

Citiți valoarea curentă a setării msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Activați setarea msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Dezactivați setarea **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

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