Compartir a través de


Establecer reglas de reserva

Las reglas de reserva en Field Service crean mensajes de advertencia o error que los usuarios ven al crear o editar un registro de reserva de recursos, en función de condiciones personalizadas. Por ejemplo, se puede crear una regla de reserva para advertir a un usuario cuando intenta reservar una orden de trabajo para un recurso en el tablero de programación que no tenga las cualificaciones necesarias para el trabajo.

Las reglas de reserva son métodos JavaScript personalizados que se ejecutarán antes de crear o editar el registro de reserva de recursos que se pueden reservar. El método de JavaScript puede aceptar un parámetro que contendrá información para el registro Reserva de recursos que se pueden reservar que se está creando y debe devolver un objeto JavaScript con las propiedades necesarias.

Configure reglas de reserva para validar una reserva cuando se crea o modifica.

Nota

  • Las reglas de reserva solo están disponibles para la vista por horas, y no para las vistas diarias, semanales o mensuales del tablero de programación y el asistente de programación. También están disponibles cuando se crea o actualiza una reserva a través del formulario de reserva de recursos que se pueden reservar.
  • Las reglas de reserva no están disponibles en el formulario de reserva de recursos que se pueden reservar, si tiene flujo de proceso de negocio habilitado en el formulario.
  • Las reglas de reserva no están disponibles en la función de reasignación en el tablero de programación.
  • Cada regla de reserva personalizada puede devolver solo un error/advertencia. Para devolver varios mensajes, configure reglas de reserva individuales para cada validación.

Crear una solución

El primer paso para configurar su regla de reserva es crear un recurso web JavaScript personalizado. Le recomendamos que cree una solución en CRM para agregar su recurso web JavaScript personalizado o use una solución existente que pueda tener para las personalizaciones.

Crear solución de CRM

  1. Desde Configuración>Soluciones, cree una nueva solución para sus recursos web JavaScript de regla de reserva.

La siguiente captura de pantalla muestra una solución recién creada. Recomendamos que su solución utilice un editor único en lugar del editor predeterminado.

Captura de pantalla de las reglas de reserva de Field Service.

  1. Después de crear la solución, seleccione el componente Recursos web y cree un nuevo recurso web.
  2. En el nuevo formulario de recurso web, especifique la siguiente información: a. Nombre b. Nombre para mostrar c. Seleccione Script (Jscript) como Tipo.
  3. Seleccione la opción del editor de texto para ingresar su código JavaScript para la regla de reserva.
  4. Seleccione Guardar para guardar el recurso web.
  5. Seleccione Publicar para asegurarse de que se ha publicado el recurso web de la regla de reserva.

Captura de pantalla de un nuevo recurso web.

Establecer una regla de reserva

  1. Desde el menú principal, vaya a Field Service>Recursos y luego elija Reglas de reserva en Configuración de reserva.

    Captura de pantalla de la lista de reglas de reserva activas de Field Service.

  2. Seleccione +Nueva para crear una nueva regla de reserva.

  3. En el formulario de regla de reserva, especifique la siguiente información: a. Nombre b. Recurso web (seleccione el recurso web que creó recientemente). c. Ingrese el nombre del método que definió en su JavaScript.

    Captura de pantalla de reglas de reserva.

  4. Guarde la regla de reserva. Una vez que guarde la regla de reserva, será utilizada por la vista horaria del tablero de programación y el asistente de programación o el formulario de entidad. Puede desactivar el registro de la regla de reserva para evitar que el tablero de programación, el asistente de programación o el formulario de la entidad de reserva ejecuten la regla.

Nota

Actualmente, las reglas de reserva solo se admiten en la vista horaria del tablero de programación y el asistente de programación. Las reglas de reserva también se admiten cuando las reservas se crean o actualizan mediante el formulario de reserva de recursos reservables. Las reglas de reserva no se ejecutan al eliminar un registro de reserva. Las reglas de reserva no funcionan en formularios cuando se usa la edición múltiple.

Crear una acción de CRM

En esta sección, veremos un ejemplo que muestra cómo puede usar una acción CRM personalizada para realizar la validación como parte de una regla de reserva.

Cuando use una acción CRM para la validación de la regla de reserva aún debe crear un recurso web personalizado según se define más arriba. El JavaScript que definirá en el recurso web personalizado llamará a la acción CRM personalizada y evaluará los resultados de la acción CRM personalizada. Ver el Anexo A al final de este documento para el código de ejemplo que puede usar para llamar a una acción CRM personalizada.

Una acción CRM personalizada deberá crearse en CRM. Le recomendamos que utilice la solución CRM que ha definido para su recurso web personalizado para agregar su acción CRM personalizada.

La acción de CRM personalizada debe tener los siguientes parámetros de entrada y salida. Puede agregar más parámetros de entrada y salida que el escenario requiera. Deberá asegurarse de que el JavaScript que defina para llamar a su acción CRM personalizada esté actualizado para admitir otros parámetros de entrada y salida.

Parámetros de entrada:

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

Parámetros de salida:

  • isError – Booleano
  • isWarning – Booleano
  • errorMessage – Cadena
  • warningMessage - Cadena

La siguiente captura de pantalla muestra un ejemplo de acción CRM personalizada. Este ejemplo comprueba si newBookableResource coincide con el recurso preferido en la orden de trabajo y si newScheduleStart está dentro de Hora de inicio prometida y Hora de finalización prometida. Se presupone que las fechas de la ventana prometida son para una sola fecha. Ejemplo: Hora de inicio prometida: 01/01/2016 8:00 AM / Hora de finalización prometida: 01/01/2016 12:00 PM

Captura de pantalla de una accción CRM personalizada.

Código de ejemplo

La función JavaScript que creó puede aceptar un solo parámetro, que se considera el contexto de reserva. El parámetro de contexto de reserva pasado no es un contexto de CRM típico utilizado en scripts del lado del 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;
};

El parámetro de contexto de reserva tendrá la siguiente definición de JavaScript.

Nota

No es necesario incluir este código JavaScript en el recurso web personalizado para la regla de reserva.

Los valores posibles para ResourceScheduleSource son del conjunto de opciones globales de origen de programación de recursos. Puede hacer uso de esta propiedad para saber si la regla de reserva se está desencadenando desde el tablero de programación o del 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
    };

Su método de validación debe devolver un objeto JavaScript con la siguiente definición.

Nota

No es necesario incluir este código JavaScript en el recurso web personalizado para la regla de reserva.

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

Definición de función JavaScript de ejemplo. El siguiente código JavaScript es el único código JavaScript que deberá incluir en su 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;
    }

El siguiente JavaScript se puede utilizar para llamar a una acción CRM personalizada que tiene los mismos parámetros de entrada y salida que el ejemplo anterior.

En el registro de la regla de reserva, el Nombre del método debe ser: MSFSAENG.ScheduleBoard.Validate. Para referencia, consulte la captura de pantalla de la sección "Configuración de una regla de reserva" de este artículo.


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

La reserva de recursos que se pueden reservas se habilita para usar reglas de reserva, para crear mensajes de advertencia o error que los usuarios ven al crear o editar un registro de reserva de recursos, en función de condiciones personalizadas. El sistema utiliza preventDefault en las reglas de reserva. Por lo tanto, los flujos de procesos empresariales y otros scripts personalizados vinculados al evento onSaveno pueden utilizarse en la entidad de reserva de recursos reservables con las reglas de reserva activadas.

Sin embargo, el procesamiento de las reglas de reserva se puede deshabilitar al guardar el formulario de Reserva habilitando la siguiente configuración, que permitiría a los usuarios usar los flujos de procesos de negocio. Las API del lado del cliente se pueden utilizar para habilitar esta configuración a nivel de entorno.

Leer el valor actual del ajuste msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Habilitar la configuración msdyn_DisableProcessBookingRulesOnSaveBookingForm.

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

Deshabilitar la configuración **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

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