Tag Archives: otrs

(Português) Workshop de OTRS no FISL 2013

Sorry, this entry is only available in Brazilian Portuguese. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

Nesta quarta feira, 3 de Julho de 2013, apresentei o OTRS para pessoas do Governo, iniciativa privada, desenvolvedores e estudantes da PUC de Porto Alegre, juntamente com os camaradas Thiago Pacheco, Fabricio Pacheco e Leonardo Thietbohl Rodrigues, com quem formei a Complemento.

Para nós foi um grande prazer realizar esta apresentação e descobrir que nosso trabalho de anos de divulgação das soluções de software livre tem repercutido. Várias pessoas me agradeceram pessoalmente (inclusive um rapaz do Ministério das Comunicações), pelos módulos e artigos que sempre fiz questão de produzir e publicar na comunidade.

Recebemos também um convite da direção da Associação do Software Livre para participar de um jantar realizado para os palestrantes e ver um dos pais do software livre, Jon Maddog Hall, vestido de monge, com brincos e pirceings.

Mais uma pra recordar.

One way of creating approval workflows with OTRS

Approval workflows can be created in different ways on OTRS.

There is a simple way to do that using ITSMIncidentProblemManagement.

With ITSMIncidentProblemManagement package, you get a Decision link on ticket menu. Obviously some configurations have to be done in order to this link be shown only for some users like a department manager (we will call this role decision makers now on). This also can be made in different ways.

I’d like to show a way to create those workflows. I made it this days and see to be efficient.

The concept

We have a group called Service Desk which watchs a queue called “ServiceDesk”. This team receives and process all tickets on the system and try to solve them. They also send some tickets to approval when it’s needed.

So we have to create a queue for each decision group. We may have decision makers on IT and decision makers on HR department for example.

We have those queues on the system:

  • ServiceDesk
  • Ask Approval
    • IT Decision Makers
    • HR Decision Makers
  • Infraestructure specialist
  • Applications specialist

When the ServiceDesk identifies a request which needs approval, they send it to the respective decision maker group.

The Decision Maker approves or not the ticket and he or she move it again to the service desk queue.

How to show Decision link only for decision makers?

Decision Makers will be registered on 2 groups: decisionit and decisionhr

Go to the SysConfig and access Ticket -> Frontend::Agent::Ticket::MenuModule

Find Ticket::Frontend::MenuModule###420-Decision and add a key called “Group” with this content: “rw:decisionit;rw:decisionhr”.

And it’s done!

Making it better

To make the decision maker’s life easier, I created a module (and a package) that moves the ticket to a “next defined queue”, in the same screen where the approval is done. In our example, the ticket will be moved back to the ServiceDesk queue.

You can download this package here.

After it’s installation, you may configure it on Sysconfig -> Ticket -> Frontend::Agent::Ticket::ViewDecisionMove

Other ways

I think OTRS is a very flexible (and not high documented) tool. So, if you know another way to make decisions workflows, please share with us 🙂

Single sign on between Joomla and OTRS Customer Interface

I have just developed my first version of a module called Kernel::System::CustomerAuth::JoomlaSSO

It allows Joomla logged users to access directly OTRS Customer interface (with automatic login) with no need to type user and pw again. OTRS Customer Backend should be the same as joomla for it to work.

Some customizetion are need on Joomla and OTRS side, so it’s not a module yet.

If you are interested on it, contact me please.

(Português) OTRS – Listas de Controle de Acessos (Access Control Lists ou ACL’s)

Sorry, this entry is only available in Brazilian Portuguese. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

As ACL’s servem para incrementar o sistema de permissões do OTRS. Com elas é possível restringir escolhas de atributos do ticket ou ações possíveis de serem tomadas de acordo com as propriedades atuais do mesmo (fila atual, estado etc).

Atualmente criamos as ACLs com implementação de códigos no arquivo Kernel/Config.pm (recomendado) e não há interface gráfica para isso. Com sua utilização, é possível inclusive implementar pequenos workflows no sistema.

Vejamos um exemplo de ACL que restringe um chamado de prioridade alta (5) para que seja permitido move-lo apenas para uma fila chamada Alerta:

# ticket acl
$Self->{TicketAcl}->{'ACL-Nome-2'} = {
  # match properties
  Properties => {
    # current ticket match properties
    Ticket => {
    Queue => ['Raw'],
    Priority => ['5 very high'],
    }
  },
  # return possible options (white list)
  Possible => {
    # possible ticket options (white list)
    Ticket => {
      Queue => ['Alerta'],
    },
  },
};

Neste exemplo, é bom que se deixe claro que a única ação que restringimos foi a alteração de fila. As outras ações continuam possíveis de acordo com as parametrizações e permissões do usuário. Por exemplo, ainda é possível adicionar notas ao chamado, responde-lo, mudar seu status para qualquer um disponível no sistema.

É possível notar que existem dois blocos de código neste exemplo acima. O  primeiro com comentário “# match properties” é a definição das propriedades atuais do ticket, como se fosse um filtro onde definimos em que ocasiões essa ACL será aplicada.

No segundo bloco definimos as restrições ou permissões que os tickets que “cairem” nesta ACL sofrerão.

Action

Vamos aprimorar este exemplo fazendo com que um ticket de prioridade 5 não possa ser fechado na fila Raw através da tela “Fechar” (módulo AgenteTicketClose). Ficaria assim:

# ticket acl
	$Self->{TicketAcl}->{'ACL-Alerta5'} = {
	  # match properties
	  Properties => {
	    # current ticket match properties
	    Ticket => {
	    Queue => ['Raw'],
	    Priority => ['5 very high'],
	    }
	  },
	  # return possible options (white list)
	  Possible => {
	    # possible ticket options (white list)
	    Ticket => {
	      Queue => ['Alerta'],
	    },
	    Action => {
              AgentTicketClose => 0,
            },
	  },
	};

Além de restringir a escolha dos atributos dos tickets, podemos definir quais ações (ou telas) poderão ser exibidas ou não ao agente/cliente. Neste exemplo acima, além de permitir apenas que o agente mova este chamado para fila Alerta, também desabilitamos a tela e o botão “Fechar” (módulo AgenteTicketClose). Assim não encorajaremos o atendente a fechar os tickets de prioridade 5 na fila Raw.

PossibleNot

No entanto, o atendente da ainda pode encerrar o chamado se este estiver na fila Raw, pois não desabilitamos a escolha os estados “Fechado” com e sem exito, ou seja, ele não verá a tela fechar, mas pode fechar o chamado caso clique em “Chamada telefônica realizada” e escolha um dos estados fechado.

Vamos simular então uma ACL onde o atendente nunca poderá fechar um chamado se o mesmo estiver na fila Raw com prioridade 5. Ficaria assim:

# ticket acl
$Self->{TicketAcl}->{'ACL-Alerta5'} = {
  # match properties
  Properties => {
    # current ticket match properties
    Ticket => {
    Queue => ['Raw'],
    Priority => ['5 very high'],
    }
  },
  # return possible options (white list)
  Possible => {
    # possible ticket options (white list)
    Ticket => {
      Queue => ['Alerta'],
    },
    Action => {
      AgentTicketClose => 0,
    },
  },
  PossibleNot => {
    # possible not ticket options
    Ticket => {
        State => ['closed successful','closed unsuccessful'],
    },	  
  },
};

Notem que adicionamos um terceiro bloco de código, o “PossibleNot”. Ali definimos o que não será possível fazer. Para tentar esclarecer mais:

  • Properties: “Quais chamados ou situações”. No nosso caso, todos os chamados que estiverem na fila Raw com prioridade 5 (Muito Alta)
  • Possible: “É possível apenas isto”! No nosso caso, em relação a mover chamados, restringimos para que seja apenas possível mover para a fila Alerta
  • PossibleNot: “Não é possível apenas isto, o resto pode”! No nosso caso, o atendente poderá escolher todos os estados disponíveis de ticket, menos “Fechado com sucesso” e “Fechado sem sucesso”.
Expressões Regulares

Também é possível utilizar expressões regulares. No exemplo abaixo (retirado da documentação oficial), exibimos apenas serviços que comecem com a palavra “Hardware”, para um ticket estiver na fila HW ou uma de suas subfilas:

$Self->{TicketAcl}->{'Only-Hardware-Services-for-HW-Queues'} = {
       # match properties
        # note we don't have "Ticket => {" because there's no ticket yet
        Properties => {
        Queue => {
            Name => ['[RegExp]HW'],
            }
        },
        # return possible options
        Possible => {
            # possible ticket options
            Ticket => {
                Service => ['[RegExp]^(Hardware)'],
            },
        },
    };

Vale a pena lembrar que os serviços começados com a palavra “Hardware” continuaram sendo exibidos em outras filas. Foi utilizando esse tipo de ACL que construí um módulo que permite escolher os serviços que queremos exibir em cada uma das filas do sistema.

 

Parâmetros possíveis

Aqui temos uma lista de todos os parâmetros possíveis para as ACLs:

# ticket acl
    $Self->{TicketAcl}->{'ACL-Name-Test'} = {
        # match properties
        Properties => {
            # current action match properties
            Frontend => {
                Action => ['AgentTicketPhone', 'AgentTicketEmail'],
            },
            # current user match properties
            User => {
                Group_rw => [
                    'hotline',
                ],
            },
            # current user match properties
            Ticket => {
                Queue => ['Raw'],
                State => ['new', 'open'],
                Priority => ['some priority'],
                Lock => ['lock'],
                CustomerID => ['some id'],
                CustomerUserID => ['some id'],
                TicketFreeKey1 => ['some key'],
                TicketFreeKey2 => ['some key'],
                # ...
                TicketFreeKey8 => ['some key'],
                TicketFreeText1 => ['some value'],
                TicketFreeText2 => ['some value'],
                # ...
                TicketFreeText8 => ['some value'],
            }
        },
        # return possible options (white list)
        Possible => {
            # possible ticket options (white list)
            Ticket => {
                Queue => ['Hotline', 'Koordination'],
                State => => ['some state'],
                Priority => ['5 very high'],
                TicketFreeKey1 => ['some key'],
                TicketFreeKey2 => ['some key'],
                # ...
                TicketFreeKey8 => ['some key'],
                TicketFreeText1 => ['some value'],
                TicketFreeText2 => ['some value'],
                # ...
                TicketFreeText8 => ['some value'],
            },
            # possible action options (white list)
            Action => {
                AgentTicketLock => 1,
                AgentTicketZoom => 1,
                AgentTicketClose => 1,
                AgentTicketPending => 0,
                AgentTicketNote => 1,
                AgentTicketHistory => 0,
                AgentTicketPriority => 1,
                AgentTicketFreeText => 0,
                AgentTicketHistory => 1,
                AgentTicketCompose => 1,
                AgentTicketBounce => 1,
                AgentTicketTicketPrint => 0,
                AgentTicketForward => 1,
                AgentTicketTicketLink => 1,
                AgentTicketPrint => 1,
                AgentTicketPhone => 1,
                AgentTicketCustomer => 1,
                AgentTicketOwner => 0,
            },
        },
        # remove options (black list)
        PossibleNot => {
            # possible ticket options (black list)
            Ticket => {
                Queue => ['Hotline', 'Koordination'],
                State => ['closed', 'removed'],
            },
        },
    };

 

Consulte também:

(Português) OTRS – Status (estados) pré definidos dos Tickets

Sorry, this entry is only available in Brazilian Portuguese. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

Uma livre tradução do manul do OTRS 3.0:
http://doc.otrs.org/3.0/en/html/states.html

O OTRS permite alterar estados de bilhetes pré-definidos e os seus tipos, ou mesmo adicionar novos. Dois atributos são importantes para um estado: o nome do estado e do tipo de estado.

Os estados padrão do OTRS são: ‘fechado com sucesso’, ‘fechado sem sucesso’, ‘merged’, ‘novo’, ‘aberto’, ‘pendente auto fechamento +’, ‘pendente auto fechamento -‘ ‘lembrete de pendente’, e ‘removido’ .

Novo

Os bilhetes estão neste estado geralmente quando são criados a partir de e-mails recebidos.
Comentário Ronaldo: Desta forma os atendentes sabem que este ticket ainda não foi lido, ou seja, nossa empresa ainda não tem conhecimento deste problema.

Aberto

Este é o estado padrão de bilhetes atribuídos a filas e agentes.

Lembrete de pendente

Quando o tempo determinado no campo “Data de Pendência” for atingido, o dono bilhete/ticket receberá um email de lembrete sobre o bilhete. Se o bilhete não estiver bloqueado, o lembrete será enviado a todos os agentes da fila. Lembrete de bilhetes só serão enviados durante o horário comercial, e são repetidamente enviados a cada 24 horas até que o estado bilhete seja alterada pelo agente. Tempo gasto pelo bilhete neste estado continua a contar para fins de escalonamento.

Pendente auto fechamento –

Bilhetes neste status serão definidos como “Fechado sem sucesso” se o tempo de espera determinado em “Data de Pendência” for atingido. Tempo gasto pelo bilhete neste estado continua a contar para fins de escalonamento.

Pendente auto fechamento +

Bilhetes neste status serão definidos como “Fechado com sucesso” se o tempo de espera determinado em “Data de Pendência” for atingido. Tempo gasto pelo bilhete neste estado continua a contar para fins de escalonamento.

Merged

Este é o estado de bilhetes que foram fundidos com outros bilhetes.

Fechado com sucesso

Este é o estado final de bilhetes que foram resolvidos com êxito. Dependendo da configuração, você pode ou não ser capaz de reabrir bilhetes fechado.

Fechado sem sucesso

Este é o estado final de bilhetes que não foram resolvidos com êxito. Dependendo da configuração, você pode ou não ser capaz de reabrir bilhetes fechado.

OTRS: Show/Hide itens on Ticket Menu according to the user group

OTRS is a great software it’s not 100% documentated. I find this tip digging the source code.

Imagine that you want to remove the Priority link from Nav Bar of Level 1 Agente Front end, while he/she is viewing a ticket and you want it to be viewable only for supervisors.

Go to ADMIN-> SysConfig -> Ticket -> Frontend::Agent::Ticket::MenuModule

Then find the parameter you want to hide/remove. In this case, Ticket::Frontend::MenuModule###300-Priority

Add a key called “Group” and the put “rw:group_that_has_access” as the content. To add more groups, separete with “;”. For example: “rw:admin;rw;supervisors”.