Variáveis de Automação e Templates no GLPI 11

Guia técnico das variáveis de notificação do GLPI 11: as tags ##...## que funcionam de verdade, o bloco FOREACH que quase ninguém conhece, as tags ##lang.*## para e-mail multilíngue, por que o solicitante sai em branco e a query de fila que a NexTool roda quando a notificação não chega.

Neste artigo7 seções

Uma variável de automação é o que separa um "Seu chamado foi atualizado" genérico de um "Chamado 12345 - Impressora sem toner mudou para Em atendimento, com a técnica Ana Paula". No GLPI essas variáveis são as tags de notificação: marcadores ##...## que o motor substitui pelo dado real no momento do envio. Parecem triviais até o dia em que o nome do solicitante sai em branco no e-mail e ninguém sabe por quê. Este guia é o mapa que usamos na sustentação de parques GLPI de clientes para acertar template de primeira.

Onde as variáveis vivem: template não é notificação

Antes de escolher tags, entenda a cadeia que o GLPI monta, porque a maioria dos "a variável não funciona" na verdade é erro de configuração, não de sintaxe. Uma mensagem só sai quando quatro peças estão alinhadas:

  • Notificação (Configurar > Notificações): liga o evento - novo chamado, acompanhamento, solução, pesquisa de satisfação.
  • Template (Modelos de notificação): o corpo em texto e o corpo em HTML, onde você escreve as tags ##...##.
  • Destinatários: quem recebe - solicitante, técnico atribuído, grupo, observador.
  • Fila e envio: o GLPI não manda o e-mail na hora; ele enfileira e a tarefa automática queuednotification despacha.

Colocar a tag certa num template que não está vinculado a nenhuma notificação ativa não produz e-mail nenhum - e o erro não é da tag.

As tags que você realmente usa

As tags são contextuais: o conjunto disponível muda conforme o item (Ticket, Change, Problem). Para chamado, estas cobrem a maioria dos templates - todas conferidas direto no motor de notificação do GLPI 11:

TagO que devolve
##ticket.id##Número do chamado
##ticket.title##Título
##ticket.description##Descrição (conteúdo da abertura)
##ticket.url##Link direto para o chamado (exige login)
##ticket.status##Status atual
##ticket.priority##Prioridade
##ticket.category##Categoria
##ticket.creationdate##Data de abertura
##ticket.solvedate##Data de solução
##ticket.duedate##Prazo de resolução (SLA)
##ticket.authors##Solicitante(s) - lista separada por vírgula
##ticket.assigntousers##Técnico(s) atribuído(s) - lista por vírgula
##ticket.assigntogroups##Grupo(s) atribuído(s)
##ticket.solution##Texto da solução
##followup.author## / ##followup.description##Dentro de ##FOREACHfollowups##
##task.author## / ##task.description##Dentro de ##FOREACHtasks##
##author.name## / ##author.email##Dentro de ##FOREACHauthors##

Repare que ##ticket.assigntousers## devolve uma lista já pronta, separada por vírgula - o GLPI faz o implode internamente. Não é um loop, é texto plano: resolve o caso de "tenho dois técnicos e quero os dois no e-mail" sem nenhum truque.

O erro de campo mais comum: o solicitante não é ##user.name##

Este é, disparado, o problema que mais reabrimos em auditoria de template: o nome do solicitante chega vazio no e-mail. A causa quase sempre é a mesma - alguém copiou ##user.name## de um tutorial de recuperação de senha para dentro de uma notificação de chamado. Em notificação de Ticket, ##user.name## simplesmente não existe: ele pertence às notificações do objeto Usuário (reset de senha, criação de conta). O GLPI não acusa erro - só substitui por vazio, e o técnico passa a tarde caçando um bug que é de fonte de dado. O solicitante de um chamado é ##ticket.authors## (lista pronta) ou, se você quer nome e e-mail de cada um separadamente, o bloco FOREACH a seguir.

FOREACH: a parte que quase ninguém conhece

Um chamado tem N acompanhamentos, N tarefas, N solicitantes. Não existe uma tag mágica que despeje tudo formatado: o GLPI expõe as coleções por um bloco de repetição. Você abre o loop, escreve o miolo uma vez com as tags do item e fecha - e ainda dá para limitar a quantos itens quiser com FIRST ou LAST:

Ola ##ticket.authors##,

Seu chamado ##ticket.id## - ##ticket.title##
mudou para: ##ticket.status##
Tecnico(s): ##ticket.assigntousers##

Ultimo acompanhamento:
##FOREACH LAST 1 followups##
[##followup.date##] ##followup.author##:
##followup.description##
##ENDFOREACHfollowups##

Acesse: ##ticket.url##

O LAST 1 (também aceita FIRST e um número maior) é o que evita o e-mail quilométrico repetindo todo o histórico a cada novo acompanhamento - um pedido recorrente de cliente que a maioria "resolve" cortando conteúdo na marra, quando bastava o modificador. As coleções que aceitam FOREACH incluem followups, tasks, authors, actors, costs e os linkeds (linkedtickets, linkedchanges, linkedproblems).

Notificação multilíngue de graça: as tags ##lang.*##

Detalhe que só aparece quando você abre a lista completa de tags: cada tag de valor tem uma companheira de rótulo. Para ##ticket.status## (o valor) existe ##lang.ticket.status##, que imprime o rótulo "Status" traduzido para o idioma do destinatário. Montando o template com pares rótulo + valor, a mesma mensagem sai em português para um usuário e em espanhol para outro, sem duplicar template:

##lang.ticket.title##: ##ticket.title##
##lang.ticket.status##: ##ticket.status##
##lang.ticket.priority##: ##ticket.priority##

Num cliente com entidades em mais de um país, isso derruba a manutenção de "um template por idioma" para um único template. O valor você não traduz - o dado é o dado; o que muda é só o rótulo, e o ##lang.*## resolve isso sozinho.

Diagnóstico: a variável está certa, mas o e-mail não sai

Quando o template está impecável e mesmo assim o e-mail some, o problema não está na tag - está na fila. O GLPI grava cada mensagem em glpi_queuednotifications e a tarefa automática queuednotification é quem envia de fato. Se a tarefa não roda (cron parado) ou o SMTP recusa, a mensagem acumula com sent_time nulo. É a primeira coisa que rodamos num chamado de "notificação não chega":

-- Notificacoes enfileiradas que ja deveriam ter saido:
-- sent_time NULL = ainda nao enviada; send_time no passado = atrasada.
SELECT id, name AS assunto, recipient, send_time, sent_try
FROM glpi_queuednotifications
WHERE sent_time IS NULL
  AND send_time <= NOW()
ORDER BY send_time ASC
LIMIT 30;

Linhas acumulando com sent_try subindo significam SMTP rejeitando; fila crescendo com sent_try em zero significa cron parado. Nos dois casos o template está certo - e você acabou de economizar a tarde que ia gastar reescrevendo tags à toa.

Onde cada variável funciona (matriz de decisão)

A confusão que herdamos de quase todo parque novo é achar que "modelo de chamado" e "template de notificação" são a mesma coisa. Não são - e só um dos dois faz substituição de ##tag##:

OndeSubstitui ##tag##?Para que serve
Template de notificação (corpo e assunto)Sim - tags, FOREACH e ##lang.*##Corpo de e-mail dinâmico
Modelo de chamado (TicketTemplate)NãoPredefinir, ocultar ou tornar obrigatórios campos na abertura
Modelo de tarefa / acompanhamentoNãoTexto-base reutilizável, sem substituição dinâmica
Assunto (subject) da notificaçãoSimMesmas tags do corpo, em uma única linha

Dica final que vale por todo o resto: ao editar um template de notificação, o GLPI mostra a aba de tags disponíveis para aquele item específico. É a fonte da verdade - contextual e sempre alinhada à versão instalada. Antes de copiar uma tag de um blog (inclusive deste), confirme que ela aparece ali.

Precisa de notificações que informem de verdade - multilíngues, com o solicitante certo e sem e-mail preso na fila? Conheça a sustentação de GLPI da NexTool.


Revisado pela equipe NexTool Solutions.

Perguntas Frequentes

Quase sempre porque o template usa ##user.name##, que não existe em notificações de Ticket (pertence às notificações do objeto Usuário, como reset de senha). O GLPI não acusa erro, apenas substitui por vazio. Use ##ticket.authors## para a lista de solicitantes ou o bloco ##FOREACHauthors## com ##author.name## e ##author.email## para tratar cada um.

Use o modificador do FOREACH: ##FOREACH LAST 1 followups## ... ##ENDFOREACHfollowups##. O LAST 1 pega apenas o acompanhamento mais recente; FIRST e números maiores também são aceitos. Sem o modificador, o loop imprime todos os follow-ups a cada envio, gerando o e-mail quilométrico clássico.

Sim. Cada tag de valor tem uma companheira de rótulo ##lang.*##: para ##ticket.status## existe ##lang.ticket.status##, que imprime o rótulo traduzido no idioma do destinatário. Montando o corpo com pares ##lang.ticket.campo##: ##ticket.campo##, um só template atende vários idiomas.

A fila, não o template. O GLPI enfileira cada mensagem em glpi_queuednotifications e a tarefa automática queuednotification faz o envio. Consulte as linhas com sent_time NULL e send_time no passado: sent_try subindo indica SMTP recusando; sent_try em zero indica cron parado.

Não. O modelo de chamado (TicketTemplate) serve para predefinir, ocultar ou tornar obrigatórios campos na abertura - ele não faz substituição de ##tag##. As variáveis de automação ##...## vivem nos templates de notificação (corpo e assunto). Confundir os dois é a origem de muito 'a variável não funciona'.

Precisa de ajuda?