Últimamente hay muchos post acerca de este tema, las distintas posibilidades existentes para realizar una asignación de servicios con sus SLAS por colas en vez de usar el método estandar de SLA <-> Cola o Customers <-> Services <-> SLA.
Introducción
Las ventajas de asignar servicios a colas es principalmente la posibilidad de tener una cola con múltiples cálculos de SLA. De forma estandar, OTRS solo permite asignar los Servicios con usuarios registrados y estos podrian abrir sus tickets con los Servicios y SLA correspondientes asignados en cualquier Cola.
Existen numerosas formas de realizarlo, la mas común es por medio de las ACL pero este tipo de configuración requiere recargar apache haciendo la operación inviable para un entorno de administración delegado ya que requiere hacerlo "a mano" dentro de la propia maquina.
Ronaldo Richieri desarrollo un modulo que permite realizar las construcciones de ACL de forma dinámica, abstrayendo esta administración al frontal del OTRS (ver aqui ). Pero este modulo sigue teniendo el hándicap de la recarga del servidor web, por lo que no era inmediato o era necesario forzar al servidor a recargarse con un reload.
En este tutorial os voy a presentar mi modificación para llevar a cabo esta asignación por código, para ello empleare gran parte del modulo desarrollado por Ronaldo para generar la interfaz administrativa. Este desarrollo está sobre versiones 3.0.x, no está probado en 3.1 pero por lo que he visto las funciones a usar utilizan los mismos parámetros y es posible usarlo con posibles ligeras modificaciones en Ticket.pm.
Con esta modificacion, cualquier usuario con permiso de escritura sobre una Cola que tenga asignado un Servicio podría crear un ticket concreto con los SLA disponibles que los administradores le proporcionen para esa Cola exclusivamente. Con esto, tambien se resuelven los problemas mencionados, ya que no se basa en si el usuario esta registrado o no, si tiene acceso puede abrir el ticket con el SLA; y si el usuario dispusiera de diferentes SLA de otros asuntos que no corresponden a esa cola, no podran asignar mas que los SLA que nosotros asociemos por la herramienta.
Ficheros modificados
- otrs/Kernel/System/Ticket.pm
- otrs/Kernel/Modules/AgentTicketPhone.pm
- otrs/Kernel/Modules/AgentTicketEmail.pm
Ficheros añadidos
- otrs/Kernel/Config/Files/QueueServices.xml
- otrs/Kernel/Modules/AdminQueueServices.pm
- otrs/Kernel/Output/HTML/Standard/AdminQueueServices.dtl
Funcionamiento
El funcionamiento interno del modulo es muy simple, el entorno grafico de asignaciones recrea una simulación parecida al de Customer <-> Services. Las asignaciones son guardadas bajo el xml global de OTRS (ZZZAuto.pm).
Despues, con los cambios efectuados sobre AgentTicketPhone (New Phone Ticket) , AgentTicketEmail (New Email Ticket) y ticket.pm hemos enlazado en la función del desplegable del servicio los datos guardados en el xml. Cada vez que se selecciona una Cola en la creación del Ticket, OTRS preguntara al xml si existen asignaciones:
- De no existir, continuara su flujo normal
- De existir, rellenara los Servicios asignados y continuara el flujo normal. Los SLAS serán posteriormente cargados normalmente cuando se seleccione su Servicio.
En este tutorial solo he expuesto una aplicación practica para creaciones del Ticket, pero es extensible a mas operaciones como el botón de Prioridad o frontales de cliente. Todos ellos tiran de la función TicketServiceList de Ticket.pm que es llamada a través de un función GetServices.pm. Solo es necesario buscar para cada tipo de acción su modulo correspondiente y modificar el GetServices que disponga como el expuesto en AgentTicketPhone.
Instalacion del modulo
Para instalar el modulo hay que dirigirse al frontal de OTRS y acceder al Gestor de paquetes situado en la pestaña de Administración.
Una vez en ella, aparecerá un panel a la izquierda donde podremos buscar el fichero opm (modulo a instalar) e instalarlo.
Siga los pasos detallados.
Cuando haya instalado el modulo vera que en la pestaña Administracion dispone de un panel adicional llamado Queue <-> Services, este panel realiza las asignaciones de Servicios y Colas de forma grafica, pero para que funcione completamente es necesario modificar 3 ficheros addicionales.
- otrs/Kernel/System/Ticket.pm
- otrs/Kernel/Modules/AgentTicketPhone.pm
- otrs/Kernel/Modules/AgentTicketEmail.pm
La razón de la modificación posterior es que son ficheros claves que varían según si se tiene o no instalado el ITSM, antes de la modificación asegúrese que dispone de una copia de los ficheros.
Ticket.pm
Situese sobre la función TicketServiceList y sustitúyala por lo siguiente:
Code: Select all
sub TicketServiceList {
my ( $Self, %Param ) = @_;
# check needed stuff
if ( !$Param{UserID} && !$Param{CustomerUserID} ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => 'Need UserID, CustomerUserID or UserID and CustomerUserID is needed!',
);
return;
}
# check needed stuff
if ( !$Param{QueueID} && !$Param{TicketID} ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => 'Need QueueID or TicketID!',
);
return;
}
my %Services;
# if ( !$Param{CustomerUserID} ) {
# %Services = $Self->{ServiceObject}->ServiceList( UserID => 1, );
# }
# else {
if ( $Param{CustomerUserID} ) {
%Services = $Self->{ServiceObject}->CustomerUserServiceMemberList(
Result => 'HASH',
CustomerUserLogin => $Param{CustomerUserID},
UserID => 1,
);
}
# workflow
my $ACL = $Self->TicketAcl(
%Param,
ReturnType => 'Ticket',
ReturnSubType => 'Service',
Data => \%Services,
);
### Queue <-> Services
if ( $Self->{ConfigObject}->Get('QueueService::QSActive') ) {
my $recorrido;
my $qs_hash=$Self->{ConfigObject}->Get('QueueService::QueueServicesName');
my %QueueServices = %{$qs_hash};
my @Items;
my $Queue;
my $aux;
for my $Queue ( keys %QueueServices ) {
@Items = split /;/, $QueueServices{$Queue};
if ( $Queue eq $Param{QueueID} )
{
%Services = ();
foreach $recorrido (@Items)
{
$Self->{DBObject}->Prepare(
SQL => 'select id from service WHERE name = ?',
Bind => [ \$recorrido, ],
);
while ( my @Row = $Self->{DBObject}->FetchrowArray() ) {
$aux = $Row[0];
}
$Services{$aux} = $recorrido;
}
}
}
}
return $Self->TicketAclData() if $ACL;
return %Services;
}
AgentTicketPhone.pm y AgentTicketEmail.pm
Situese sobre la función _GetServices y sustitúyala por lo siguiente:
Code: Select all
sub _GetServices {
my ( $Self, %Param ) = @_;
# get service
my %Service;
# if ( ( $Param{QueueID} || $Param{TicketID} ) && $Param{CustomerUserID} ) {
if ( $Param{QueueID} || $Param{TicketID} )
{
%Service = $Self->{TicketObject}->TicketServiceList(
%Param,
Action => $Self->{Action},
UserID => $Self->{UserID},
);
}
return \%Service;
}
Os adjunto el paquete .opm base para instalar la interfaz grafica.
Un saludo.