Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As regras de reserva no Field Service criam mensagens de aviso ou erro que os usuários veem ao criar ou editar um registro de reserva de recursos, com base em condições personalizadas. Por exemplo, uma regra de reserva pode ser criada para avisar um usuário quando ele tentar reservar uma ordem de serviço para um recurso no quadro de agendamento que não tenha as características exigidas para o trabalho.
As regras de reserva são métodos JavaScript personalizados que são executados antes do registo Bookable Resource Booking ser criado ou editado. O método JavaScript pode aceitar um parâmetro que contenha informação para o registo de Reserva de Recursos Bookable que está a ser criado e deve devolver um objeto JavaScript com as propriedades necessárias.
Configure regras de reserva para validar uma reserva quando ela for criada ou modificada.
Observação
- As regras de reserva estão disponíveis apenas para a visualização horária, e não para visualizações diárias, semanais ou mensais do quadro de horários e do assistente de agendamento. Eles estão disponíveis quando uma reserva é criada ou atualizada no formulário de reserva de recursos reserváveis.
- As regras de reserva não estão disponíveis no formulário de reserva de recursos reserváveis, se ele tiver o fluxo do processo comercial habilitado no formulário.
- As regras de reserva não estão disponíveis na função de reatribuição no quadro de horários.
- Cada regra de reserva personalizada pode retornar apenas um erro ou aviso. Para retornar várias mensagens, configure regras de reserva individuais para cada validação.
Criar uma solução
Crie um recurso da Web JavaScript personalizado. Recomendamos que você crie uma solução no Microsoft Power Apps para adicionar seu recurso da Web JavaScript personalizado ou use uma solução existente usada para personalizações.
Crie uma nova solução para os recursos da Web JavaScript da sua regra de reserva. Recomendamos que sua solução use um editor exclusivo em vez do editor padrão.
Depois de criar a solução, crie um novo recurso da Web.
Selecione JavaScript (JS) como o tipo.
Introduza o seu código JavaScript para a regra de reserva.
Selecione Guardar e Publicar.
Configurar uma regra de reserva
Vá para Field Service e selecione a área Recursos .
Em Definições de Reserva, selecione Regras de Reserva e, em seguida, selecione Novo.
Introduza as seguintes informações:
- O nome da regra de reserva.
- O recurso da Web que você criou recentemente.
- O nome do método que você definiu em seu JavaScript.
Selecione Guardar e Fechar. A regra de reserva é usada pela visualização horária do quadro de horários e do assistente de agendamento ou pelo formulário da entidade.
Observação
As regras de reserva só são suportadas na visualização horária do painel de agendamentos e do assistente de 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 recursos reserváveis. As regras de reserva não são executadas ao eliminar um registo de reserva. As regras de reserva não funcionam em formulários ao usar edições múltiplas. Para interromper a execução da regra, desative a regra de reserva.
Criar uma ação de processo personalizada
Crie uma ação de processo personalizada para executar a validação como parte de uma regra de reserva. No JavaScript do seu recurso Web personalizado, chame a ação de processo personalizada e avalie os resultados da ação. Vá para o código de exemplo para ver como chamar uma ação de processo personalizada.
Recomendamos que você use a solução que definiu para seu recurso da Web personalizado para adicionar sua ação de processo personalizada.
Use os seguintes parâmetros de entrada e saída. Você pode adicionar mais parâmetros de entrada e saída conforme o cenário exigir. Você precisará garantir que o JavaScript que você define para chamar sua ação de processo personalizada seja atualizado para suportar seus outros parâmetros de entrada e saída.
Parâmetros de entrada:
- InícioOriginalAgendamento – DateTime
- fimDoCalendárioOriginal – DateTime
- originalBookableResource – ReferênciaDeEntidade
- originalScheduleSource – Lista de opções
- newScheduleStart - DateTime
- newScheduleEnd – "DateTime"
- isCreate – Booleano
- isUpdate – Booleano
Parâmetros de saída:
- isError – Booleano
- isWarning – Booleano
- errorMessage – Cadeia de caracteres
- mensagemDeAviso - String
A captura de tela a seguir mostra um exemplo de ação de processo personalizado. Este exemplo está verificando se o newBookableResource corresponde ao recurso preferencial na ordem de serviço e se o newScheduleStart está dentro do Time From Promised e Time To Promised. Presume-se que as datas indicadas pela janela prometida são para uma data única. Exemplo: Hora Desde Prometida: 01/01/2016 8:00AM / Hora Até Prometida: 01/01/2016 12:00PM.
Código de exemplo
A função JavaScript que você 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 de CRM típico usado em scripts 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 definição de JavaScript.
Observação
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 da fonte de agendamento de recursos. Pode utilizar esta propriedade para saber se a regra de reserva está a ser acionada a partir do quadro de horários 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
};
Seu método de validação deve retornar um objeto JavaScript com a seguinte definição.
Observação
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 de função JavaScript. O código JavaScript a seguir é o único código JavaScript que você precisará incluir em seu recurso da 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 a seguir pode ser usado para chamar uma ação personalizada do CRM que tenha os mesmos parâmetros de entrada e saída do exemplo anterior.
No registro da regra de reserva, o Nome do método deve ser: MSFSAENG.ScheduleBoard.Validate. Para referência, consulte a captura de tela na seção "Configurando 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 recursos reserváveis está habilitada para usar regras de reserva para criar avisos ou mensagens de erro que os usuários veem ao criar ou editar um registro de reserva de recursos, com base em condições personalizadas. O sistema utiliza preventDefault nas regras de reserva. Portanto, os fluxos do processo de negócios e outros scripts personalizados vinculados ao onSaveevento não podem ser usados na entidade de reserva de recursos agendáveis com as regras de reserva ativadas.
No entanto, o processamento das regras de reserva pode ser desativado ao salvar o formulário de reserva, habilitando a configuração abaixo, que permitiria que os usuários usassem os fluxos do processo comercial. As APIs do lado do cliente podem ser usadas para habilitar essa configuração em um nível de ambiente.
Leia o valor atual da configuração msdyn_DisableProcessBookingRulesOnSaveBookingForm.
Xrm.Utility.getGlobalContext().getCurrentAppSettings()["msdyn_DisableProcessBookingRulesOnSaveBookingForm"]
Habilite a configuração msdyn_DisableProcessBookingRulesOnSaveBookingForm.
Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",true,).then(() => {a = "success"}, (error) => {a = error})
Desative a configuração **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.
Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",false,).then(() => {a = "success"}, (error) => {a = error})