Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este artículo describe cómo puede anular el cálculo de tiempo predeterminado.
El cálculo del tiempo en los acuerdos de nivel de servicio (SLA) calcula el WarningTime
y FailureTime
de los indicadores clave de rendimiento (KPI) de SLA, teniendo en cuenta parámetros de entrada, como ApplicableFrom
(Hora de inicio del campo de tipo DateTime), CalendarId
(GUID) y Duration
(duración de la advertencia o duración de la falla en minutos). Los valores finales de WarningTime
o FailureTime
se calculan en función de la programación de servicio al cliente y los calendarios de días festivos asociados con el artículo SLA.
Además del tiempo de advertencia y falla, el tiempo transcurrido también se calcula si hay un escenario de pausa y reanudación configurado para el SLA. Para ignorar las horas de trabajo invertidas durante el estado de Pausa del KPI de SLA, el tiempo transcurrido se suma al tiempo de falla final.
Para habilitar su propio cálculo de tiempo personalizado, puede definir una interfaz API que tenga un conjunto fijo de parámetros de entrada y salida y agregar una lógica personalizada para calcular el tiempo.
Nota
El cálculo de tiempo personalizado solo se admite como parte del complemento y no como ninguna otra entidad, por ejemplo, un flujo de trabajo personalizado.
Habilite el cálculo de tiempo personalizado de los KPI de SLA
Vaya a make.powerapps.com.
Vaya a Configuración avanzada>Personalizaciones>Personalizar el sistema>Procesos>Nuevo.
En el cuadro de diálogo Crear proceso, introduzca los siguientes detalles:
- Ingrese un nombre de proceso, por ejemplo, CustomPluginTime Calculation.
- Seleccione Acción en la lista desplegable Categoría.
- En la lista desplegable Entidad, seleccione Ninguno (global).
- Seleccione la opción Proceso nuevo a partir de una plantilla existente (seleccione desde la lista).
- Seleccione la plantilla SLACustomTimeCalculationTemplate en la lista.
- Seleccione Aceptar.
En la plantilla, agregue los parámetros necesarios (si los hay) y seleccione Activar.
-
Para información sobre seleccionar el complemento que necesita, vaya a Escenarios y complementos, más adelante en este tema.
Para vincularlo a la acción personalizada creado en el paso 3, vaya a la herramienta de registro de complementos y registre el complemento que creó con su organización. Para obtener más información sobre el complemento, consulte Registrar un complemento.
En el Centro de administración de servicios de Copilot, agregue o edite la acción personalizada creada anteriormente con el elemento de SLA:
- Establezca la opción de alternancia Permitir cálculo de tiempo personalizado en Sí.
- En el campo Proceso de cálculo de tiempo personalizado, seleccione la acción personalizada creada en el paso 3.
- Seleccione Guardar y cerrar.
En el formulario SLA, seleccione Activar y aplíquelo a la entidad requerida. El tiempo de advertencia y falla del SLA KPI aparece de acuerdo con la lógica de cálculo de tiempo proporcionada en la acción personalizada.
Para obtener más información sobre cómo aplicar los SLA, vaya a Aplicar SLA.
Para exportar la solución a otro entorno, primero puede agregar el SLA (cuyo elemento tiene la referencia de acción personalizada) a la solución personalizada. Agregar el SLA también exporta el proceso de flujo de trabajo de acción personalizado. A continuación, incluya el mensaje del SDK en la solución, que exporta el complemento que creó anteriormente.
Escenarios y complementos
Consulte los siguientes escenarios y sus complementos para implementar un código de complemento asociado con su acción personalizada.
Escenario 1:
Si no tiene un escenario de pausa o reanudación, solo se va a calcular WarningTime
y FailureTime
. Cada vez que se crean nuevas instancias de KPI, SLA inicia la API de cálculo de tiempo personalizado para calcular solo WarningTime
y FailureTime
en una sola llamada.
En ese caso, requestType
es getEndTime
y otros atributos se pueden obtener como se define en el siguiente ejemplo:
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
_service = factory.CreateOrganizationService(context.UserId);
// Step 1: Retrieving Input Parameters.
string regardingId = context.InputParameters["regardingId"] as string;
string calendarId = context.InputParameters["calendarId"] as string;
string requestType = context.InputParameters["requestType"] as string;
string slaItemId = context.InputParameters["slaItemId"] as string;
string entityName = context.InputParameters["entityName"] as string;
try
{
// implement this requestType for any new SLA KPi instance creation.
if (requestType.Equals("getEndTime", StringComparison.CurrentCultureIgnoreCase))
{
int warningDuration = (int)context.InputParameters["firstInputDuration"];
int failureDuration = (int)context.InputParameters["secondInputDuration"];
DateTime warningStartTime = (DateTime)context.InputParameters["firstInputDate"];
DateTime failureStartTime = (DateTime)context.InputParameters["secondInputDate"];
// Step 2 : Add the custom Logic to calculate the WarningTime and FailureTime
string returnCalendarId = CalculateWarningAndFailureTime(regardingId, calendarId, slaItemId, entityName, warningStartTime, failureStartTime, warningDuration, failureDuration, out DateTime warningTime, out DateTime failureTime);
// Step 3 : return the output values.
context.OutputParameters["firstOutputValue"] = DateTime.SpecifyKind(warningTime, DateTimeKind.Utc).ToString();
context.OutputParameters["secondOutputValue"] = DateTime.SpecifyKind(failureTime, DateTimeKind.Utc).ToString();
context.OutputParameters["returnCalendarId"] = returnCalendarId;
return;
}
// implement this requestType for finding Paused time for any new SLA KPi instance after it resumed.
if (requestType.Equals("getElapsedTime", StringComparison.CurrentCultureIgnoreCase))
{
DateTime casePausedTime = (DateTime)context.InputParameters["firstInputDate"];
DateTime caseResumedTime = (DateTime)context.InputParameters["secondInputDate"];
int existingElapsedTime = (int)context.InputParameters["firstInputDuration"];
// Step 2 : Add the custom Logic to calculate the elapsedTime between startTime(paused) and endTime(resumed)
double elapsedTimeInMinutes = CalculateElapsedTime(regardingId, calendarId, slaItemId, entityName, casePausedTime, caseResumedTime, existingElapsedTime);
// Step 3 : return the output values.
context.OutputParameters["firstOutputValue"] = elapsedTimeInMinutes.ToString();
context.OutputParameters["secondOutputValue"] = elapsedTimeInMinutes.ToString();
return;
}
} catch (Exception ex) {
return;
}
throw new Exception("Invalid requestType:" + requestType+ " for entityName:" + entityName + " of id:" + regardingId);
}
// in this example, we're using Custom Field(new_country) on the Case entity to apply the required calendar.
private string CalculateWarningAndFailureTime(string regardingId, string calendarId, string slaItemId, string entityName, DateTime warningStartTime, DateTime failureStartTime, int warningDuration, int failureDuration, out DateTime warningTime, out DateTime failureTime)
{
OrganizationResponse customizedTimeCalculationResponse;
warningTime = DateTime.UtcNow;
failureTime = DateTime.UtcNow;
int newWarningTime = warningDuration;
int newFailureTime = failureDuration;
int customCode = 0;
// Step 1: fetch the Case Entity record
Entity caseRecord = FetchCaseRecord(entityName, regardingId);
if (caseRecord.Attributes.Contains("new_country"))
{
customCode = (int)(((OptionSetValue)(caseRecord.Attributes["new_country"])).Value);
// Example 1: Override calendar at runtime: Choose Calendar based on any custom logic
if (customCode == 0)
{
// fetch IST calendar & override CalendarId
IST_CALENDAR = FetchCalendar("IST_CALENDAR", _service);
calendarId = IST_CALENDAR;
}
else if (customCode == 1)
{
// fetch PST calendar & override CalendarId
PST_CALENDAR = FetchCalendar("PST_CALENDAR", _service);
calendarId = PST_CALENDAR;
}
}
// use OOB SLATimeCalculation Custom Action to do actual calculation_
OrganizationRequest requestTimeCalculation = new OrganizationRequest("msdyn_SLATimeCalculation");
requestTimeCalculation["requestType"] = "getEndTime";
requestTimeCalculation["calendarId"] = calendarId;
// calculate warning time
if (warningDuration != -1)
{
requestTimeCalculation["startTime"] = warningStartTime;
requestTimeCalculation["minutes"] = newWarningTime;
customizedTimeCalculationResponse = _service.Execute(requestTimeCalculation);
customizedTimeCalculationResponse.Results.TryGetValue("returnValue", out object outputValue1);
warningTime = DateTime.SpecifyKind(DateTime.Parse((string)outputValue1), DateTimeKind.Utc);
}
// calculate Failure time
if (failureDuration != -1)
{
requestTimeCalculation["startTime"] = failureStartTime;
requestTimeCalculation["minutes"] = newFailureTime;
customizedTimeCalculationResponse = _service.Execute(requestTimeCalculation);
customizedTimeCalculationResponse.Results.TryGetValue("returnValue", out object outputValue2);
failureTime = DateTime.SpecifyKind(DateTime.Parse((string)outputValue2), DateTimeKind.Utc);
}
return calendarId;
}
Escenario 2:
Si hay un escenario de pausa o reanudación, se deben realizar los siguientes cálculos:
- Cálculo de
elapsedTime
entre los estados de pausa y reanudación. Para este escenario, el SLA invoca la API de cálculo de tiempo personalizado para calcular el tiempo transcurrido entre la pausa y la reanudación. En ese caso, requestType serágetElapsedTime
y otros atributos se pueden obtener como se define en el ejemplo de código de complemento. - Cálculo de nuevos procesos
WarningTime
yFailureTime
para instancias reanudadas. En este caso,requestType
serágetEndTime
y otros atributos se pueden obtener como se define en el siguiente ejemplo:
private double CalculateElapsedTime(string regardingId, string calendarId, string slaItemId, string entityName, DateTime casePausedTime, DateTime caseResumedTime, int existingElapsedTime)
{
if (caseRecord.Attributes.Contains("new_country"))
{
if ((int)(((OptionSetValue)(caseRecord.Attributes["new_country"])).Value) == 0)
{
// fetch IST id
IST_CALENDAR = FetchCalendar("IST_CALENDAR", _service);
calendarId = IST_CALENDAR;
}
else if ((int)(((OptionSetValue)(caseRecord.Attributes["new_country"])).Value) == 1)
{
// fetch PST id
PST_CALENDAR = FetchCalendar("PST_CALENDAR", _service);
calendarId = PST_CALENDAR;
}
}
// use OOB SLATimeCalculation Custom Action to do actual calculation_
OrganizationRequest requestTimeCalculation = new OrganizationRequest("msdyn_SLATimeCalculation");
requestTimeCalculation["startTime"] = casePausedTime;
requestTimeCalculation["endTime"] = caseResumedTime;
requestTimeCalculation["requestType"] = "getElapsedTime";
requestTimeCalculation["calendarId"] = calendarId;
// calculate elapsed time
customizedTimeCalculationResponse = _service.Execute(requestTimeCalculation);
customizedTimeCalculationResponse.Results.TryGetValue("returnValue", out object outputValue1);
double totalElapsedTime = existingElapsedTime + Double.Parse(outputValue1.ToString());
return totalElapsedTime;
}
Códigos de error en el cálculo de tiempo personalizado
Los siguientes son los códigos de error para los diversos escenarios de error que pueden ocurrir durante el cálculo de tiempo personalizado.
Código de error: 10000004
Mensaje de error: "El flujo de trabajo de la API de cálculo de tiempo personalizado para el elemento de SLA {0} debe estar activo".
Motivo
El error ocurre si el flujo de trabajo de cálculo de tiempo personalizado está deshabilitado.
Resolución
Al abrir el SLA, verá una notificación de formulario junto con un botón Activar si el SLA está activo pero el flujo de trabajo de cálculo de tiempo personalizado está deshabilitado. Para evitar este problema, asegúrese de que el proceso Flujo de trabajo de cálculo de tiempo personalizado esté siempre en estado Activo. Realice la implementación del SLA y luego compruébela solo después de que se complete. Asegúrese de no eliminar ni desactivar el proceso de flujo de trabajo manualmente ni mediante la personalización.
Código de error: 10000005
Mensaje de error: "Seleccione el proceso de cálculo de tiempo personalizado".
Motivo
El error ocurre si el flujo de trabajo de cálculo de tiempo personalizado está habilitado pero no hay ninguna acción de proceso de flujo de trabajo asociada con el elemento SLA.
Resolución
Agregue el proceso de flujo de trabajo y guarde el elemento SLA. Para evitar este problema, asegúrese de que el proceso Flujo de trabajo de cálculo de tiempo personalizado se complete en el valor de búsqueda si el interruptor está configurado en Activado.
Código de error: 10000006
Mensaje de error: "Falta el flujo de trabajo del proceso de cálculo de tiempo personalizado para el elemento de SLA {0}. {Placeholder="{0}"} se refiere al id. del elemento de SLA".
Motivo
El error se produce si el flujo de trabajo de cálculo de tiempo personalizado está habilitado durante la activación del SLA, la acción del proceso de flujo de trabajo se asocia con el elemento de SLA con GUID válido, pero el flujo de trabajo se elimina.
Resolución
Debe corregir el flujo de trabajo no válido. Elimine el flujo de trabajo existente del elemento SLA, cree un nuevo flujo de trabajo y luego agregue el nuevo flujo de trabajo al mismo elemento SLA. Para evitar este problema, asegúrese de no eliminar ningún flujo de trabajo manualmente ni como parte del proceso de implementación. Además, asegúrese de verificar sus cambios antes de importarlos directamente a un entorno de producción.
Código de error: 10000007
Mensaje de error: "Falta la implementación del complemento para el proceso de cálculo de tiempo personalizado en el Marcador de posición del Ítem de SLA {0} {Placeholder="{0}"} se refiere al ID del ítem de SLA."
Motivo
El error ocurre si el flujo de trabajo de cálculo de tiempo personalizado está habilitado pero falta el paso del proceso de mensajería del SDK del complemento asociado o el complemento no está registrado.
Resolución
Asegúrese de agregar el paso SDK al exportar el SLA desde el entorno de origen o desarrollo. Para evitar este problema, asegúrese de agregar el paso de mensaje SDK y el ensamblaje del complemento en la solución SLA.
Código de error: 10000008
Mensaje de error: "La hora de advertencia o de error devuelta por el proceso de cálculo de tiempo personalizado para el elemento de SLA {0} no es válida. {Placeholder="{0}"} se refiere al id. del elemento de SLA".
Motivo
El error ocurre si la acción de flujo de trabajo de calculo de tiempo personalizado devuelve una Hora de fallo para requestType getEndTime.
Resolución
Debe realizar una depuración para descubrir por qué el proceso de flujo de trabajo personalizado no devuelve los valores adecuados. Para evitar el problema, asegúrese de agregar y probar todos los escenarios antes de implementarlos en producción. Por ejemplo, esto incluye varias aplicaciones de elementos de SLA y escenarios de Pausa o Reanudación.
Código de error: 10000009
Mensaje de error: "El tiempo transcurrido devuelto por el proceso de cálculo de tiempo personalizado para el elemento de SLA {0} no es válido. {Placeholder="{0}"} se refiere al id. del elemento de SLA".
Motivo
El error ocurre si la acción de flujo de trabajo de calculo de tiempo personalizado devuelve un Tiempo transcurrido para requestType getElapsedTime.
Resolución
Debe realizar una depuración para descubrir por qué el proceso de flujo de trabajo personalizado no devuelve los valores adecuados cuando el caso se ha pausado o resumido. Para evitar el problema, asegúrese de agregar y probar todos los escenarios antes de implementarlos en producción. Por ejemplo, esto incluye escenarios de Pausa o Reanudación.
Código de error: 10000010
Mensaje de error: "No se encuentra el flujo de trabajo del proceso de cálculo de tiempo personalizado {0} para el elemento de SLA {1}"
Motivo
El error ocurre si la acción personalizada para el cálculo de tiempo personalizado no se encuentra en el sistema.
Resolución
Debe depurar y averiguar si la acción personalizada está presente en el sistema con el mismo nombre que se muestra en el error. Para evitar este problema, asegúrese de crear el mismo prefijo de nombre de acción personalizado que se muestra en el mensaje de error. Debe cambiar el prefijo de su solución o evitar exportarla como una solución no administrada. También puede evitar crear la interfaz de flujo de trabajo directamente en la solución administrada y, en su lugar, crear la solución administrada en la personalización predeterminada y luego agregarla a la solución.
Preguntas frecuentes
Para obtener información sobre el cálculo de tiempo personalizado de los KPI de SLA, vaya a Preguntas frecuentes sobre el cálculo de tiempo personalizado de los KPI de SLA.