Compartir a través de


Habilite el cálculo de tiempo personalizado de los KPI de SLA

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

  1. Vaya a make.powerapps.com.

  2. Vaya a Configuración avanzada>Personalizaciones>Personalizar el sistema>Procesos>Nuevo.

  3. En el cuadro de diálogo Crear proceso, introduzca los siguientes detalles:

    1. Ingrese un nombre de proceso, por ejemplo, CustomPluginTime Calculation.
    2. Seleccione Acción en la lista desplegable Categoría.
    3. En la lista desplegable Entidad, seleccione Ninguno (global).
    4. Seleccione la opción Proceso nuevo a partir de una plantilla existente (seleccione desde la lista).
    5. Seleccione la plantilla SLACustomTimeCalculationTemplate en la lista.
    6. Seleccione Aceptar.

    Plantilla de cálculo de tiempo personalizado

  4. En la plantilla, agregue los parámetros necesarios (si los hay) y seleccione Activar.

    Habilite los argumentos de proceso para cualquier elemento de SLA

  5. Escribir los complementos.

    Para información sobre seleccionar el complemento que necesita, vaya a Escenarios y complementos, más adelante en este tema.

  6. 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.

    Registrar y vincular el complemento

  7. En el Centro de administración de servicios de Copilot, agregue o edite la acción personalizada creada anteriormente con el elemento de SLA:

    1. Establezca la opción de alternancia Permitir cálculo de tiempo personalizado en .
    2. En el campo Proceso de cálculo de tiempo personalizado, seleccione la acción personalizada creada en el paso 3.
    3. Seleccione Guardar y cerrar.
  8. 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.

  9. 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 y FailureTime 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.

Definir contratos de nivel de servicio

Aplicar SLA

Habilitar los registros para el SLA