Compartir por


Configura regras de reserva

As regras de reserva en Field Service crean mensaxes de aviso ou erro que os usuarios ven ao crear ou editar un rexistro de reserva de recursos, en función de condicións personalizadas. Por exemplo, pódese crear unha regra de reserva para avisar a un usuario cando tente reservar un pedido de traballo a un recurso no panel de programación que non dispoña de coñecementos necesarios para o traballo.

As regras de reserva son métodos de JavaScript personalizados que se executarán antes da creación ou edición do rexistro de reserva de recursos reservables. O método JavaScript pode aceptar un parámetro que conterá información para o rexistro Reserva de recursos reservables que se está creando e debe devolver un obxecto JavaScript coas propiedades requiridas.

Configura regras de reserva para validar unha reserva cando se crea ou se modifica.

Nota

  • As regras de reserva só están dispoñibles para a visualización horaria, e non para as visualizacións diarias, semanais ou mensuais do panel de programación e do asistente de programación. Tamén están dispoñibles cando se crea ou actualiza unha reserva mediante o formulario de reserva de recursos reservables.
  • As regras de reserva non están dispoñibles no formulario de reserva de recursos reservables se está o fluxo do proceso de negocio activado no formulario.
  • As regras de reserva non están dispoñibles na función de reatribución no panel de programación.
  • Cada regra de reserva personalizada só pode devolver un erro/aviso. Para devolver varias mensaxes, configura regras de reserva individuais para cada validación.

Crear unha solución

O primeiro paso para configurar a súa regra de reserva é crear un recurso web JavaScript personalizado. Recomendámoslle que cree unha solución en CRM para engadir o seu recurso web JavaScript personalizado ou que use unha solución existente que poida ter para as personalizacións.

Crear unha solución de CRM

  1. Desde Configuración>Solucións, crea unha nova solución para os teus recursos web JavaScript de regra de reserva.

A seguinte captura de pantalla mostra unha solución de nova creación. Recomendamos que a súa solución use un editor exclusivo en lugar do editor predeterminado.

Captura de pantalla das regras de reserva para Field Service.

  1. Despois de crear a solución, seleccione o compoñente Recursos web e cree un novo recurso web.
  2. Introduza a seguinte información a no novo formulario de recurso web: a. Nome b. Nome para mostrar c. Seleccione Script (Jscript) como tipo
  3. Seleccione a opción do editor de texto para introducir o seu código JavaScript para a regra de reserva.
  4. Seleccione Gardar para gardar o seu recurso web.
  5. Selecciona Publicar para asegurarte de que se publicou o recurso web da regra de reserva.

Captura de pantalla dun novo recurso web.

Configurar unha regra de reserva

  1. No menú principal, vai a Field Service>Recursos e, a continuación, escolla Regras de reserva en Configuración de reserva.

    Captura de pantalla da lista de regras de reserva activas en Field Service.

  2. Selecciona +Novo para crear unha nova regra de reserva.

  3. No formulario de regra de reserva, introduza a seguinte información: a. Nome b. Recurso web (Seleccione o recurso web que creou recentemente). c. Introduza o nome do método que definiu no seu JavaScript.

    Captura de pantalla das regras de reserva.

  4. Garde a regra de reserva. Unha vez que garde a regra de reserva, será utilizada pola vista horaria do panel de programación e do asistente de programación ou do formulario de entidade. Pode desactivar o rexistro da regra de reserva para evitar que o panel de programación, o asistente de programación ou o formulario de entidade de reserva poida executar a regra.

Nota

As regras de reserva só son compatibles actualmente coa vista horaria do panel de programación e do asistente de programación. As regras de reserva tamén son compatibles cando se crean ou actualizan as reservas mediante o formulario de reserva de recursos reservables. As regras de reserva non se executan ao eliminar un rexistro de reserva. As regras de reserva non funcionan nos formularios cando se usa a edición múltiple.

Crear unha acción de CRM

Nesta sección veremos un exemplo que mostra como pode usar unha acción de CRM personalizada para realizar a validación como parte dunha regra de reserva.

Cando utilices unha acción CRM para a validación da regra de reserva, aínda terás que crear un recurso web personalizado como se definiu anteriormente. O JavaScript que definirás no teu recurso web personalizado chamará á acción CRM personalizada e avaliará os resultados da acción CRM personalizada. Consulte o anexo A situado ao final deste documento para ver código de mostra que pode usar para chamar unha acción de CRM personalizada.

Deberá crearse unha acción de CRM personalizada en CRM. Recomendamos que use a solución CRM que definiu para o seu recurso web personalizado para engadir a súa acción CRM personalizada.

A acción de CRM personalizada debería ter os seguintes parámetros de entrada e saída. Podes engadir máis parámetros de entrada e saída segundo o requira o teu escenario. Deberás asegurarte de que o JavaScript que defines para chamar á túa acción CRM personalizada estea actualizado para admitir os teus outros parámetros de entrada e saída.

Parámetros de entrada:

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

Parámetros de saída:

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

A seguinte captura de pantalla mostra un exemplo de acción de CRM personalizada. Esta mostra está comprobando se o newBookableResource coincide co recurso preferido na orde de traballo e se o newScheduleStart está dentro do Tempo dende o prometido e Tempo ata o prometido. Suponse que as datas da xanela prometida son para unha única data. Exemplo: Hora de inicio prometida: 01/01/2016 8:00 a.m./ Hora de finalización prometida: 01/01/2016 0:00 p.m.

Captura de pantalla dunha acción de CRM personalizada.

Código de mostra

A función JavaScript creada pode aceptar un único parámetro, que se considera o contexto da reserva. O parámetro de contexto de reserva pasado non é un contexto de CRM típico que se usa nas secuencias de comandos do lado do cliente.

Esquema de contexto de reserva:

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

O parámetro de contexto de reserva terá a seguinte definición de JavaScript.

Nota

Non é necesario incluír este código JavaScript no recurso web personalizado para a regra de reserva.

Os valores posibles para ResourceScheduleSource son da fonte global de programación de recursos conxunto de opcións. Pode facer uso desta propiedade para saber se se activa a regra de reserva desde o panel de programación ou o asistente de programación.

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

O seu método de validación debe devolver un obxecto JavaScript coa seguinte definición.

Nota

Non é necesario incluír este código JavaScript no recurso web personalizado para a regra de reserva.

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

Exemplo de definición de función JavaScript. O seguinte código JavaScript é o único código JavaScript que terá que incluír no seu recurso web personalizado.


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

O seguinte JavaScript pode usarse para chamar a unha acción de CRM personalizada que teña os mesmos parámetros de entrada e saída que a mostra anterior.

No rexistro da regra de reserva, o Nome do método debe ser: MSFSAENG.ScheduleBoard.Validate. Como referencia, vexa a captura de pantalla na sección "Configuración dunha regra de reserva" deste artigo.


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

Notas adicionais

A reserva de recursos reservables está habilitada para usar regras de reserva para crear avisos ou mensaxes de erro que os usuarios ven ao crear ou editar un rexistro de reserva de recursos, en función de condicións personalizadas. O sistema utiliza preventDefault nas regras de reserva. Polo tanto, os fluxos de procesos comerciais e outros scripts personalizados vinculados ao onSaveevento non se poden utilizar na entidade de reserva de recursos reservables coas regras de reserva activadas.

Non obstante, o procesamento das regras de reserva pódese desactivar ao gardar o formulario de reserva activando a seguinte configuración, o que permitiría aos usuarios usar os fluxos do proceso de negocio. As API do lado do cliente pódense usar para activar esta configuración a nivel de ambiente.

Ler o valor actual da configuración msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Activa a configuración msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Desactiva a configuración **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

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