Impostare le regole di prenotazione

Le regole di prenotazione in Field Service consentono di creare i messaggi di errore o di avvertimento visualizzati dagli utenti durante la creazione o la modifica di un record di prenotazione della risorsa in base alle condizioni personalizzate. Ad esempio, una regola di prenotazione potrebbe essere creata per avvertire un utente quando tenta di prenotare un ordine di lavoro a una risorsa nella scheda di pianificazione che non ha le capacità delle caratteristiche desiderate richieste per il lavoro.

Le regole di prenotazione sono metodi JavaScript personalizzati che vengono eseguiti prima della creazione o della modifica del record Prenotazione risorsa prenotabile. Il metodo JavaScript può accettare un parametro che conterrà informazioni per il record Prenotazione risorsa prenotabile creato e deve restituire un oggetto JavaScript con le proprietà richieste.

Imposta le regole di prenotazione per convalidare una prenotazione quando viene creata o modificata.

Nota

  • Le regole di prenotazione sono disponibili solo per la visualizzazione oraria e non per le visualizzazioni giornaliere, settimanali o mensili della scheda di pianificazione e dell'assistente di pianificazione. Sono disponibili anche quando viene creata o aggiornata una prenotazione tramite il modulo di prenotazione delle risorse prenotabili.
  • Le regole di prenotazione non sono disponibili nel modulo di prenotazione delle risorse prenotabili, se nel modulo è abilitato il flusso del processo aziendale.
  • Le regole di prenotazione non sono disponibili nella funzionalità di riassegnazione della scheda di pianificazione.
  • Ciascuna regola di prenotazione personalizzata può restituire un solo errore/avviso. Per restituire più messaggi, imposta regole di prenotazione individuali per ciascuna convalida.

Creare una soluzione

Il primo passaggio per impostare la regola di prenotazione è creare una risorsa Web JavaScript personalizzata. Ti consigliamo di creare una soluzione in CRM per aggiungere la tua risorsa Web JavaScript personalizzata o utilizzare una soluzione esistente che potresti avere per le personalizzazioni.

Creare una soluzione CRM

  1. Da Impostazioni>Soluzioni, crea una nuova soluzione per le tue risorse Web JavaScript per le regole di prenotazione.

Lo screenshot seguente mostra una soluzione appena creata. Consigliamo che la tua soluzione utilizzi un editore univoco anziché l'editore predefinito.

Schermata delle regole di prenotazione per Field Service

  1. Dopo aver creato la soluzione, seleziona il componente Risorse Web e crea una nuova risorsa Web.
  2. Nel nuovo modulo della risorsa Web immetti le seguenti informazioni: a. Nome b. Nome visualizzato c. Seleziona Script (Jscript) come tipo
  3. Seleziona l'opzione dell'editor di testo per inserire il tuo codice JavaScript per la regola di prenotazione.
  4. Selezionare Salva per salvare la risorsa Web.
  5. Seleziona Pubblica per assicurarti che la risorsa Web della regola di prenotazione sia pubblicata.

Schermata di una nuova risorsa Web.

Impostare una regola di prenotazione

  1. Dal menu principale, vai a Field Service>Risorse e quindi scegli Regole di prenotazione sotto Impostazioni di prenotazione.

    Schermata dell'elenco delle regole di prenotazione attive per Field Service.

  2. Seleziona +Nuovo per creare una nuova regola di prenotazione.

  3. Nel modulo della regola di prenotazione immetti le informazioni seguenti: a. Nome b. Risorsa Web (seleziona la risorsa Web che hai creato di recente). c. Inserisci il nome del metodo che hai definito nel tuo JavaScript.

    Screenshot delle regole di prenotazione.

  4. Salva la regola di prenotazione. Una volta salvata la regola di prenotazione, verrà utilizzata dalla visualizzazione oraria della scheda di pianificazione e dell'assistente di pianificazione o del modulo dell'entità. È possibile disattivare il record della regola di prenotazione per impedire alla scheda di pianificazione, all'assistente di pianificazione o al modulo dell'entità di prenotazione di eseguire la regola.

Nota

Le regole di prenotazione sono attualmente supportate solo nella visualizzazione oraria della scheda di pianificazione e dell'assistente di pianificazione. Le regole di prenotazione sono supportate anche quando le prenotazioni vengono create o aggiornate utilizzando il modulo di prenotazione delle risorse prenotabili. Le regole di prenotazione non eseguono la cancellazione di un record di prenotazione. Le regole di prenotazione non funzionano sui moduli quando si utilizza la modifica multipla.

Creare un'azione CRM

In questa sezione, esamineremo un esempio che mostra come utilizzare un'azione CRM personalizzata per eseguire la convalida come parte di una regola di prenotazione.

Quando si utilizza un'azione CRM per la convalida della regola di prenotazione, sarà comunque necessario creare una risorsa Web personalizzata come definito sopra. Il JavaScript che definirai nella tua risorsa Web personalizzata chiamerà l'azione CRM personalizzata e valuterà i risultati dell'azione CRM personalizzata. Vedi l'allegato A alla fine di questo documento per il codice di esempio che è possibile utilizzare per chiamare un'azione CRM personalizzata.

Un'azione CRM personalizzata dovrà essere creata in CRM. Ti consigliamo di utilizzare la soluzione CRM che hai definito per la tua risorsa Web personalizzata per aggiungere la tua azione CRM personalizzata.

L'azione CRM personalizzata deve avere i seguenti parametri di input e output. Puoi aggiungere ulteriori parametri di input e output come richiesto dallo scenario. Dovrai assicurarti che il JavaScript definito per chiamare la tua azione CRM personalizzata sia aggiornato per supportare i parametri di input e output aggiuntivi.

Parametri di input.

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

Parametri di output:

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

Lo screenshot seguente mostra un esempio di azione CRM personalizzata. Questo esempio verifica se newBookableResource corrisponde alla risorsa preferita nell'ordine di lavoro e se newScheduleStart è all'interno di Tempo inizio promessa e Tempo completamento promessa. Si presume che le date dell'intervallo temporale della promessa siano per una singola data. Esempio: Tempo inizio promessa: 01/01/2016 8:00 / Tempo completamento promessa: 01/01/2016 12:00.

Screenshot di un'azione CRM personalizzata.

Codice di esempio

La funzione JavaScript che hai creato può accettare un singolo parametro, che è considerato il contesto di prenotazione. Il parametro passato nel contesto di prenotazione non è un tipico contesto CRM utilizzato nello scripting lato client.

Schema del contesto di prenotazione:

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

Il parametro del contesto di prenotazione avrà la seguente definizione JavaScript.

Nota

Non è necessario includere questo codice JavaScript nella risorsa Web personalizzata per la regola di prenotazione.

I possibili valori per ResourceScheduleSource provengono dal set di opzioni globale di origine pianificazione risorsa. Puoi utilizzare questa proprietà per sapere se la regola di prenotazione viene attivata dalla scheda di pianificazione o dall'assistente di pianificazione.

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

Il metodo di convalida deve restituire un oggetto JavaScript con la seguente definizione.

Nota

Non è necessario includere questo codice JavaScript nella risorsa Web personalizzata per la regola di prenotazione.

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

Definizione della funzione JavaScript di esempio. Il seguente codice JavaScript è l'unico codice JavaScript che dovrai includere nella tua risorsa Web personalizzata.


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

Il seguente JavaScript può essere utilizzato per chiamare un'azione CRM personalizzata con gli stessi parametri di input e output dell'esempio precedente.

Nel record della regola di prenotazione, il campo Nome metodo deve essere: MSFSAENG.ScheduleBoard.Validate. Per riferimento, vedi lo screenshot nella sezione "Impostazione di una regola di prenotazione" di questo articolo.


    /// <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 aggiuntive

La prenotazione della risorsa prenotabile è abilitata per utilizzare le regole di prenotazione e creare i messaggi di errore o di avvertimento visualizzati dagli utenti durante la creazione o la modifica di un record di prenotazione della risorsa in base alle condizioni personalizzate. Il sistema utilizza preventDefault nelle regole di prenotazione. Di conseguenza, i flussi dei processi aziendali e altri script personalizzati legati all'evento onSave non possono essere utilizzati sull'entità di prenotazione delle risorse prenotabili con le regole di prenotazione abilitate.

Tuttavia, l'elaborazione delle regole di prenotazione può essere disabilitata sul salvataggio del modulo di prenotazione abilitando l'impostazione seguente, che permetterebbe agli utenti di utilizzare i flussi del processo aziendale. Le API lato client possono essere utilizzate per abilitare questa impostazione a livello di ambiente.

Leggere il valore attuale dell'impostazione msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Attiva l'impostazione msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Disattivare l'impostazione **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

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