arielgritti
Mega Sage

Buenas a todos,

 

Objetivo

Este artículo es para compartir con vosotros la implementación de una solución que se nos planteó en nuestra compañía respecto de la asignación automática de incidencias (podríamos ampliarla a cualquier "task") a técnicos del Help-Desk con algún algoritmo, tipo round-robin.

 

Escenario

Existen incidencias que son asignadas a un grupo de Help-Desk pero no a un técnico. Un usuario tipo "coordinador" debe asignar manualmente esas incidencias a los técnicos disponibles.

 

Solución propuesta

  • Mediante reglas de asignación asignamos las incidencias a grupos de resolución de diferentes Help-Desk distribuidos (greográficamente en algunos casos, por funcionalidades en otros)
  • Una vez las incidencias están asignadas a esos grupos, el mecanismo que implementamos fue el siguiente:
  • Para cada usuario del Help-Desk agregamos 2 columnas en la tabla sys_user
    • Round Robin Active (True/False)
    • Last Ticket Assigned (DateTime)
  • Creamos este script include
var GLOIncidentUtil = Class.create();
GLOIncidentUtil.prototype = {
	initialize: function() {
	},
	
	
	/*
	Query the incident table without assigned_to tech of the groupIN parameter
	and assign one using round robin algoritm
 	*/
	roundRobinTechIncident: function(groupIN)
	{
		gs.log('RR groupIN ' + groupIN);
		//Incidents without assigned_to tech
		var grINC = new GlideRecord("incident");
		grINC.addQuery('assignment_group', groupIN);
		grINC.addQuery('assigned_to','');
		grINC.addActiveQuery();
		grINC.query();
		
		//loop
		while (grINC.next()) {
			gs.log('RR INC ' + grINC.number);
			
			//Tech round robin pool
			var group = new GlideRecord('sys_user_grmember');
			group.addQuery('group', groupIN);
			group.addQuery('user.u_round_robin_active',true);
			group.orderBy('user.u_last_ticket_assigned');
			group.query();
			
			//Assigned Tech
			if (group.next()) {
				gs.log('RR tech ' + group.user.name);
				//Update round robin tech data
				var nowdt = gs.nowDateTime();
				var updateDate = new GlideRecord('sys_user');
				updateDate.addQuery('sys_id', group.user);
				updateDate.query();
				
				while(updateDate.next())
					{
					updateDate.u_last_ticket_assigned = nowdt;
					updateDate.update();
				}
			
				//Incident update
				grINC.comments = 'Incidencia asignada de forma automática por ServiceNow al técnico: ' + group.user.name;
				grINC.assigned_to = group.user;
				grINC.u_round_robin_assigned = true;
				grINC.update();
			}
		}
	},
	
	type: 'GLOIncidentUtil'
};

 

  • Creamos un scheduled job con las siguientes características: ejecución cada minuto, que simplemente llama al Script Include y le pasa como parámetro el sys_id del grupo de Help-Desk que queremos hacer el "reparto round-robin" de incidencias
var obj = new GLOIncidentUtil();
obj.roundRobinTechIncident('f9950e98dbbee200b1ff73200f9619ee');

 

Conclusiones

Con este simple mecanismo, logramos que se asigne de forma totalmente automática incidencias a técnicos de un grupo de Help-Desk sin que haya un coordinador por ejemplo que lo haga de forma manual.

 

Algunas consideraciones

  • El procedimiento permite que un usuario de Help-Desk que pertenezca a más de un grupo reciba incidencias de todos los grupos que pertenece, puesto las columnas se agregaron a "nivel de usuario" en sys_user
  • Se podría modificar la lógica para hacer este cambio a nivel de "miembros del grupo" en sys_user_grmember y hacerlo aún más específico
  • Se podría integrar esta lógica con la "Delegación", pero decidimos no hacerlo puesto si un usuario "Delega" en otro, aunque esté "activo" para recibir por round-robin incidencias (y está "fuera") el usuario "delegado" verá las asignaciones del técnico y todo seguirá funcionando. Esto quita trabajo al coordinador de tener que "poner/quitar" del pool de round-robin a los técnicos
  • Podríamos (y en ello estamos ;-)) ampliar el alcance de la funcionalidad a cualquier "task", para la asignación, por ejemplo, de tareas de catálogo (SCTASK) a técnicos que se encarguen de completarlas.

 

Agradecimientos

Como suele ser habitual, para montar este tipo de soluciones me he valido de ideas que ya había en la "Comunidad" y las he modificado/adaptado a nuestra necesidad, por tanto, vaya mi agradecimiento a todos aquellos que aportáis contenido a la comunidad.

 

 

Version history
Last update:
‎02-26-2018 09:11 AM
Updated by: