Arquivo da categoria: OTRS

Workshop de OTRS no FISL 2013

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.

Novo fórum OTRS em Português

No ínicio de Março de 2012 participei da certificação oficial OTRS que ocorreu aqui no Brasil. Como resultado deste processo, abrimos um Forum em portugues no site oficial do OTRS e pretendemos concentrar lá as questões que antes eram resolvidas no meu blog ou no de outros amigos brasileiros, portugueses e de outros países. Visite!

http://forums.otrs.org/

E também temos agora, uma nova área de wiki em português:

http://wiki.otrs.org

Um jeito de criar um workflow de aprovação no OTRS

Workflows de aprovação podem ser criados de diferentes maneiras no OTRS, principalmente quando você trabalha com o módulo de gerenciamento de mudanças.

Há uma maneira um pouco mais simples de se trabalhar com aprovações utilizando o apenas o módulo de gerenciamento de Incidentes e Problemas (ITSMIncidentProblemManagement).

Ao instalar o pacote ITSMIncidentProblemManagement, você visualizará um link “Decision” nos tickets. Obviamente há algumas configurações a serem feitas para que este link apareça apenas para decisores. Isto também pode ser feito de diversas maneiras também!

Mas gostaria de compartilhar uma maneira de construir um fluxo de aprovações utilizando filas. Desenhei isto para um cliente estes dias e parece eficaz.

O conceito

Temos uma central de atendimento que atende uma fila chamada “Central”. Esta equipe recebe todos os chamados da empresa e se encarrega de resolve-los em primeiro nível quando possível, solicitar aprovações quando necessário ou encaminhar para um dos possíveis grupos especialistas de 2o ou 3o nível da empresa se não conseguir resolver em primeira instância.

Criamos então uma fila para cada aprovador. Por exemplo, podemos ter uma ou mais pessoas responsáveis por aprovar solicitações de TI, e outras pessoas responsáveis por aprovar solicitações de RH.

Temos no OTRS então algumas filas. Por exemplo:

  • Central (Central de atendimento Nível 1)
  • Solicitar Aprovação
    • Aprovadores TI
    • Aprovadores RH
  • Suporte Especialista Infraestrutura
  • Suporte Especialista Aplicações

Quando a Central de atendimento identifica que uma solicitação precisa de aprovação de um gestor da área de TI, ela encaminha esta solicitação para a fila “Aprovadores TI”.

O gestor da área por sua vez aprova este chamado e reencaminha o mesmo para a Central novamente.

Como exibir o link Decision apenas para os aprovadores?

Os aprovadores estarão cadastrados nos grupos aprovadoresti e aprovadoresrh.

Acesse o SysConfig e acesse Ticket -> Frontend::Agent::Ticket::MenuModule

Encontre o parâmetro Ticket::Frontend::MenuModule###420-Decision adicione uma chave Group com o conteúdo “rw:aprovadoresti;rw:aprovadoresrh” sem aspas.

Pronto!

Melhorando a vida do Gestor

Para facilitar um pouco a vida do gestor, criei um módulo que move o chamado automaticamente para um fila especificada pelo administrador do sistema. Neste nosso exemplo, o ticket seria movido automaticamente para a fila Central novamente após a aprovação do gestor, podendo inclusive ir com um status diferenciado.

Você pode fazer o download deste módulo aqui.

Após instalar este módulo, faças as configurações necessárias no Sysconfig -> Ticket -> Frontend::Agent::Ticket::ViewDecisionMove

Outras maneiras

O OTRS é uma ferramenta que necessita de uma documentação mais clara em alguns pontos. Portanto, se você trabalha de outra maneira com aprovações dentro dele, por favor, compartilhe com a gente 🙂

Login automático entre Joomla e a interface de cliente do OTRS

Acabo de desenvolver a minha primeira versão do módulo Kernel::System::CustomerAuth::JoomlaSSO.

Com ele, usuário logados no Joomla, acessam diretamente a interface de cliente do OTRS sem a necessidade de digitar usuário e senha. O base de clientes do OTRS deve ser a mesma do Joomla.

Algumas modificações são necessárias no Joomla e no OTRS, por isso ainda não é um modulo fácil de instalar.

Se você possuir interessante em fazer esta integração em sua instalação, fale comigo!

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

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:

OTRS – Status (estados) pré definidos dos Tickets

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: Mostrar/ocultar itens no menu do Ticket de acordo com o grupo do usuário

O OTRS é uma ferramenta poderosa que oculta muitos de suas possibilidades no código que ainda não está 100% documentado. Essa eu descobri fazendo engenharia reversa no código.

Imagine que você quer retirar o menu Prioridade do Ticket para os atendentes de 1o nível e deixar apenas visível para supervisores.

Acesse ADMIN-> Configurações do Sistema -> Ticket -> Frontend::Agent::Ticket::MenuModule

Em seguida ache o parametro de configuração referente ao item que você deseja ocultar. Neste caso, Ticket::Frontend::MenuModule###300-Priority

Adicione um chave “Group” e no campo conteúdo coloque “rw:nome_do_grupo_que_tera_acesso”. Para adicionar mais de um grupo, separe por ponto e virgula: “rw:admin;rw:supervisores”

Passo a Passo para instalar um OTRS 3 completo no Ubuntu Server 11.04

A partir de uma instalação clean do Ubuntu. Vamos executar os seguintes comandos:

Vamos atualizar o sistema

sudo apt-get update
sudo apt-get upgrade

Vamos instalar a maior parte dos pacotes necessários pelo OTRS 3

sudo apt-get install otrs2 aspell-pt-br build-essential

Durante este processo, o servidor pedirá que você indique uma senha de Mysql para seu servidor. Coloque uma senha e anote-a!

O sistema também te perguntará se deseja configurar automaticamente a base de dados do OTRS. Eu escolhi que não (Configure database for otrs2 with dbconfig-common?)

Agora, removemos o OTRS 2 que não será necessário.

sudo apt-get remove otrs2

Vamos baixar o otrs para o servidor, descompactar e renomear sua pasta.

cd /opt
wget http://ftp.otrs.org/pub/otrs/otrs-3.0.10.tar.bz2
tar jcvpf otrs-3.0.10.tar.bz2
mv otrs-3.0.10 otrs

Instalando os módulos perl necessários:

sudo perl -MCPAN -e shell

Responda todas as perguntas com a resposta padrão que está entre “[]”. Quando surgir o prompt (cpan[1]>) digite:

install YAML
install Encode::HanExtra
install JSON::XS
install Net::LDAP

(aqui na instalação do Net::LDAP, quando perguntado se você deseja instalar um modulo opcional, responda sim (y))

install MKUTTER/SOAP-Lite-0.710.10.tar.gz
exit

Criando os arquivos de configurações

sudo rm /etc/apache2/conf.d/otrs2
sudo cp /opt/otrs/scripts/apache2-httpd.include.conf /etc/apache2/sites-available/otrs
sudo cp /opt/otrs/Kernel/Config.pm.dist /opt/otrs/Kernel/Config.pm
sudo a2ensite otrs
sudo apache2ctl restart

Arrumando permissões:

sudo usermod -a -G nogroup otrs
sudo usermod -a -G www-data otrs
cd /opt/otrs/bin
sudo ./otrs.SetPermissions.pl /opt/otrs --otrs-user=otrs --web-user=www-data --otrs-group=nogroup --web-group=www-data

Finalmente, acesse o instalador do OTRS via Web, de um outro computador que tenha um navegador:

http://seu_servidor_ou_ip/otrs/installer.pl

Siga o passo a passo apresentado na tela. Neste método, você vai precisar da senha do servidor de banco de dados que você instalou e anotou 🙂