ActualTime vs Contract Hours: Controle de Tempo no GLPI

ActualTime mede o tempo real do técnico; Contract Hours controla o saldo do contrato e fatura. Comparativo dos dois plugins de tempo no GLPI, o trade-off do actiontime compartilhado, veredito por cenário e como medir o gap de arredondamento.

Neste artigo8 seções

Medir o tempo de um chamado e cobrar esse tempo são dois problemas diferentes. Um é sobre produtividade da equipe: quanto tempo real o técnico gastou. O outro é sobre contrato: quantas horas o cliente já consumiu e quanto ainda tem. Confundir os dois é o erro que mais vemos na sustentação - e a escolha entre ActualTime e Contract Hours começa exatamente aí.

O problema: três planos de "tempo" no GLPI

Antes de escolher plugin, vale separar três coisas que o GLPI trata de formas diferentes:

  • Tempo estimado - a duração que você planejou para a tarefa.
  • Tempo real - quanto o técnico de fato levou, cronometrado.
  • Tempo faturável - o que entra na conta do contrato, já arredondado e com regras comerciais.

O campo nativo Duração da tarefa (armazenado em segundos no actiontime) resolve o básico, mas exige digitação manual e não sabe nada sobre contrato. É aí que entram os dois plugins.

ActualTime (TICGAL)

O ActualTime é um plugin gratuito e open source da TICGAL. Ele adiciona botões de play, pause e stop na tarefa do chamado e cronometra o tempo real que o técnico passa nela. Ao parar, grava esse tempo medido na duração da tarefa. O foco é honesto e estreito: transformar "acho que levei uns 40 minutos" em um número medido. Não tem noção de contrato, saldo ou faturamento - e não precisa ter, porque o objetivo dele é métrica de esforço, não cobrança.

Contract Hours (NexTool)

O Contract Hours é um módulo licenciado do NexTool voltado a quem vende pacote de horas. O cronômetro fica na timeline do chamado, mas o que ele produz é diferente: ao parar, o tempo é arredondado para o mínimo faturável configurado (padrão 15 minutos), vira uma TicketTask privada automática e debita o saldo do contrato vinculado àquele chamado. Ele carrega o que o ActualTime não tem: quota mensal por contrato, extrato de consumo, dashboard de "Consumo de Horas" para o cliente na interface simplificada, alertas de contrato expirado ou estourado e, desde a versão 3.6, o conceito de horas não faturáveis (cortesia) - tempo que é registrado mas não desconta do saldo.

Comparativo lado a lado

CritérioDuração nativa (manual)ActualTime (TICGAL)Contract Hours (NexTool)
Como o tempo é capturadoDigitação manualCronômetro na tarefaCronômetro na timeline
Mede tempo realNão (o que você digitar)SimSim
Arredondamento faturávelNãoNãoSim (mínimo configurável, múltiplo de 5)
Vínculo com contratoNãoNãoSim (por entidade; grupo E categoria)
Saldo / quota de horasNãoNãoSim (quota mensal + alertas)
Horas não faturáveis (cortesia)NãoNãoSim (toggle por tarefa)
Extrato / relatório de consumoNativo (limitado)BásicoDetalhado por ciclo / período
Dashboard para o clienteNãoNãoSim ("Consumo de Horas")
Onde grava o tempoactiontimeactiontimeactiontime (fonte de verdade) + saldo
LicençaNativoGratuito (GPL)Licenciado
GLPI suportado10 e 1110 e 1111 apenas

O trade-off que importa na operação

Na sustentação, já rodamos os dois: ActualTime em clientes onde a dor era produtividade interna, Contract Hours onde o contrato de horas era o coração do faturamento. O detalhe que só aparece operando é que os dois terminam tocando o mesmo campo nativo, o actiontime da tarefa. O ActualTime grava ali o tempo real medido; o Contract Hours trata o actiontime da tarefa como fonte de verdade (a partir da 3.4.2) e cria uma tarefa privada com o tempo já arredondado. Rodar os dois no mesmo chamado, sem uma regra de quem é o "dono" da tarefa, gera duas durações concorrentes - a medição crua do técnico brigando com o lançamento faturável arredondado. Decidimos, por isso, separar os planos: ActualTime como métrica interna (nunca faturável) e Contract Hours como plano contratual, e nunca deixar os dois criarem tarefa no mesmo ticket. O motivo é simples: o número que vai para a fatura do cliente precisa ser o arredondado e ciente do contrato, não os segundos crus - e os segundos crus são justamente o que a gestão quer para dimensionar capacidade. Duas audiências, dois números, duas ferramentas.

O erro comum é esperar que o ActualTime responda "quantas horas restam no contrato?". Ele não tem esse conceito. Todo cliente que tentou montar isso exportando dados do ActualTime para uma planilha viu o número divergir do real em semanas. E há o gap do arredondamento: o Contract Hours arredonda para cima até o mínimo faturável (15 minutos por padrão, múltiplo de 5 por compatibilidade com o GLPI). Uma tarefa de 3 minutos fatura 15. Num mês com muitos chamados curtos, a diferença entre o total real (ActualTime) e o total faturado (Contract Hours) é material - e é exatamente essa diferença que você negocia com o cliente, ou absorve como cortesia pelo toggle de não faturável.

Meça o gap você mesmo

Como os dois plugins gravam no campo nativo actiontime (em segundos), dá para quantificar o tempo lançado direto no banco, sem depender de tabela de plugin. Some por técnico no mês e compare com o total faturado que aparece no extrato do Contract Hours:

-- Horas lançadas por técnico no mês (campo nativo actiontime, em segundos)
SELECT u.name AS tecnico,
       ROUND(SUM(tt.actiontime) / 3600, 2) AS horas_lancadas
FROM glpi_tickettasks tt
JOIN glpi_users u ON u.id = tt.users_id_tech
WHERE tt.date BETWEEN '2026-06-01' AND '2026-06-30 23:59:59'
  AND tt.actiontime IS NOT NULL
GROUP BY tt.users_id_tech
ORDER BY horas_lancadas DESC;

Se o total daqui bater com o real medido mas divergir do faturado, a diferença é o arredondamento mais as horas de cortesia - e isso é informação de negociação, não erro.

Veredito por cenário

  • Use ActualTime quando a pergunta é "minha equipe é produtiva?". Você quer medir esforço real, alimentar indicadores internos e não cobra por hora. Custo zero, instalação simples.
  • Use Contract Hours quando você vende pacote de horas e o cliente pergunta "quanto já usei e quanto sobra?". Precisa de saldo, extrato, arredondamento faturável, dashboard do cliente e alerta de estouro. É investimento, mas paga o próprio custo no primeiro contrato que você deixa de subfaturar.
  • Use os dois quando você quer o real interno E o faturável externo, desde que em planos separados: ActualTime como métrica (não faturável) e Contract Hours como cobrança, com regra clara de que só um cria tarefa por chamado.
  • Fique só no campo nativo quando o volume é baixo e a duração manual já resolve. Não instale plugin para um problema que você não tem.

Custo e esforço

ActualTime é gratuito (GPL): o custo é o de sempre em plugin - validar a build para a sua versão do GLPI e incluí-lo na janela de upgrade. Contract Hours é licenciado, mas o esforço de implantação real não está no timer, e sim no modelo de contrato: definir quota, mapear o grupo e a categoria que resolvem cada contrato (a regra é E, não OU), configurar o mínimo faturável e a visibilidade de quem vê cada contrato no dashboard. É meia hora de clique e algumas horas de decisão comercial. O retorno aparece no primeiro fechamento de mês em que o extrato sai pronto para o cliente, sem planilha.

Na NexTool implantamos e sustentamos os dois modelos em GLPI de clientes B2B. Se o seu gargalo é transformar horas de chamado em faturamento defensável - com saldo, extrato e dashboard que o cliente entende - o módulo Contract Hours do plugin NexTool resolve exatamente isso. Se a dúvida ainda é qual plano faz sentido para a sua operação, fale com a gente.


Revisado pela equipe NexTool Solutions.

Perguntas Frequentes

Sim, os dois terminam escrevendo no campo nativo actiontime da tarefa. Podem coexistir, mas em planos separados: ActualTime para métrica interna (não faturável) e Contract Hours para cobrança. Nunca deixe os dois criarem tarefa no mesmo chamado, senão você soma a medição crua com o lançamento arredondado e infla as horas.

Porque o Contract Hours arredonda para cima até o mínimo faturável (padrão 15 minutos, múltiplo de 5). Uma tarefa de 3 minutos fatura 15. A diferença entre o real e o faturado é o arredondamento somado às horas marcadas como não faturáveis (cortesia). É esperado e é justamente o que você negocia com o cliente.

Não. O ActualTime só mede o tempo real gasto na tarefa; não tem conceito de contrato, quota ou saldo. Para responder 'quanto já usei e quanto sobra' você precisa do Contract Hours ou de um controle externo, que tende a divergir do real com o tempo.

Não. O módulo Contract Hours é GLPI 11 apenas. Em GLPI 10, para medir tempo você usa o ActualTime ou o campo nativo de duração; o controle de contrato precisa ser resolvido por outra via até a migração para o 11.

O GLPI nativo tem o campo Duração na tarefa (actiontime, em segundos). Dá para somar por técnico via SQL ou pela busca. Funciona para volume baixo, mas é manual e não sabe nada sobre contrato nem arredondamento faturável.

Precisa de ajuda?