Configurar regras de reserva
As regras de reserva no Field Service criam mensagens de erro ou de aviso que os utilizadores recebem quando criam ou editam um registo de reserva do recurso, com base em condições personalizadas. Por exemplo, uma regra de reserva podia ser criada para avisar um utilizador quando tenta reservar uma ordem de intervenção para um recurso no quadro da agenda que não tenha as competências pretendidas para a tarefa.
As regras da reserva são métodos JavaScript personalizados que são executados antes do registo da reserva de recurso reservável ser criado ou editado. O método JavaScript pode aceitar a criação de um parâmetro que conterá informações para o registo da Reserva de Recurso Reservável e deve devolver um objeto JavaScript com as propriedades necessárias.
Configure regras de reserva para validar uma reserva quando é criada ou modificada.
Nota
- As regras de reserva só estão disponíveis para a vista horária, e não para as vistas diária, semanal ou mensal do quadro da agenda e assistente da agenda. Também estão disponíveis quando uma reserva é criada ou atualizada através do formulário de reserva de recurso reservável.
- As regras de reserva não estão disponíveis no formulário de reserva de recurso reservável, se tiver fluxo de processo empresarial ativado no formulário.
- As regras de reserva não estão disponíveis na funcionalidade de reatribuição no quadro da agenda.
- Cada regra de reserva personalizada pode devolver apenas um erro/aviso. Para devolver várias mensagens, configure regras de reserva individuais para cada validação.
Criar uma solução
O primeiro passo para configurar a sua regra de reserva é criar um recurso Web JavaScript personalizado. Recomendamos que crie uma solução no CRM para adicionar o seu recurso Web JavaScript personalizado ou use uma solução existente que possa ter para personalizações.
Criar Solução CRM
- Em Definições>Soluções, crie uma nova solução para os seus recursos Web JavaScript de regra de reserva.
A imagem que se segue mostra uma solução recém-criada. Recomendamos que a sua solução utilize um editor único em vez do editor predefinido.
- Depois de criar a solução, selecione o componente Recursos Web e crie um novo recurso Web.
- No novo formulário do recurso Web, introduza as informações seguintes: a. Nome b. Nome a apresentar c. Selecione Script (Jscript) como tipo
- Selecione a opção de editor de texto para introduzir o seu código JavaScript para a regra de reserva.
- Selecione Guardar para guardar o seu recurso Web.
- Selecione Publicar para se certificar de que o recurso Web da regra de reserva foi publicado.
Configurar uma regra de reserva
A partir do menu principal, vá a Field Service>Recursos e, em seguida, escolha Regras de Reserva em Definições de Reserva.
Selecione +Nova para criar uma nova regra de reserva.
No formulário da regra de reserva, introduza as seguintes informações: a. Nome b. Recurso Web (Selecione o recurso Web que criou recentemente). c. Introduza o nome dp método definido no seu JavaScript.
Guarde a sua regra de reserva. Quando guardar a regra da reserva, será usada pela vista horária do quadro da agenda e assistente da agenda ou o formulário da entidade. Pode desativar o seu registo de regras de reserva para que o quadro da agenda, o assistente de agenda ou o formulário da entidade de reserva não execute a regra.
Nota
As regras de reserva são atualmente suportadas apenas na vista horária do quadro da agenda e assistente da agenda. As regras de reserva também são suportadas quando as reservas são criadas ou atualizadas usando o formulário de reserva de recurso reservável. As regras de reserva não executam aquando da eliminação de um registo de reserva. As regras de reserva não funcionam em formulários quando utiliza edição múltipla.
Criar uma ação CRM
Nesta secção, vamos ver um exemplo que mostra como pode usar uma ação CRM personalizada para realizar a validação como parte de uma regra de reserva.
Quando utilizar uma ação CRM para a validação da regra de reserva, ainda terá de criar um recurso Web personalizado, conforme definido acima. O JavaScript que irá definir no seu recurso Web personalizado chamará a Ação CRM personalizada e avaliará os resultados da ação CRM personalizada. Consulte o anexo A no fim deste documento para obter um exemplo de código que pode utilizar para chamar uma ação CRM personalizada.
Será necessário criar uma ação CRM personalizada no CRM. Recomendamos que utilize a solução CRM que definiu para o seu recurso Web personalizado para adicionar a sua ação CRM personalizada.
A ação CRM personalizada deve ter os seguintes parâmetros de entrada e saída. Pode adicionar mais parâmetros de entrada e saída à medida que o seu cenário necessita. Terá de garantir que o JavaScript que define para chamar a sua ação CRM personalizada é atualizado para suportar os seus 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 imagem que se segue mostra um exemplo de ação CRM personalizada. Este exemplo verifica se newBookableResource corresponde ao recurso preferencial na ordem de intervenção e se newScheduleStart está dentro da Hora de Início Prometida e da Hora de Fim Prometida. Assume-se que as datas do intervalo prometido são para uma única data. Exemplo: Hora de Início Prometida: 01/01/2016 08:00 / Hora de Fim Prometida: 01/01/2016 00:00.
Código de exemplo
A função JavaScript que criou pode aceitar um único parâmetro, que é considerado o contexto de reserva. O parâmetro de contexto de reserva passado não é um contexto típico de CRM usado no script do lado do cliente.
Esquema do contexto da 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 definição de JavaScript.
Nota
Não é necessário incluir este código JavaScript no recurso Web personalizado para a regra de reserva.
Os valores possíveis para ResourceScheduleSource são do conjunto de opções globais de origem do agendamento de recursos. Pode utilizar esta propriedade para saber se a regra de reserva está a ser acionada a partir do quadro da agenda ou do assistente de agendamento.
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 método de validação tem de devolver um objeto JavaScript com a definição seguinte.
Nota
Não é necessário incluir 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 definição da função JavaScript. O código JavaScript que se segue é o único código JavaScript que terá de incluir 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 JavaScript que se segue pode ser usado para chamar uma ação CRM personalizada que tenha os mesmos parâmetros de entrada e saída que o exemplo anterior.
No registo da regra de reserva, o Nome do Método deve ser: MSFSAENG.ScheduleBoard.Validate. Para referência, consulte a captura de ecrã na secção "Configurar uma 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 recurso reservável está ativada para utilizar as regras de reserva de forma a criar avisos ou mensagens de erro ou aviso que os utilizadores veem quando criam ou editam um registo de reserva do recurso, com base em condições personalizadas. O sistema utiliza preventDefault
nas regras de reserva. Como tal, o fluxos de processo empresarial e outros scripts personalizados vinculam-se ao evento onSave
não podem ser usados na entidade de reserva de recursos reserváveis com as regras de reserva ativadas.
No entanto, o processamento das regras de reserva pode ser desativado quando guarda o formulário de Reserva, ativando a definição abaixo, o que permitiria que os utilizadores usassem os fluxos de processo empresarial. As APIs do lado do cliente podem ser utilizadas para ativar esta definição ao nível do ambiente.
Ler o valor atual da definição msdyn_DisableProcessBookingRulesOnSaveBookingForm
.
Xrm.Utility.getGlobalContext().getCurrentAppSettings()["msdyn_DisableProcessBookingRulesOnSaveBookingForm"]
Ativar a definição msdyn_DisableProcessBookingRulesOnSaveBookingForm
.
Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",true,).then(() => {a = "success"}, (error) => {a = error})
Desativar a definição **msdyn_DisableProcessBookingRulesOnSaveBookingForm**
.
Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",false,).then(() => {a = "success"}, (error) => {a = error})