O calculo justo soma apenas o tempo em que o ticket esteve sob responsabilidade do time. A funcao abaixo percorre os intervalos de estado e acumula so os que contam, ignorando bot ativo e aguardando cliente.
// sla.js
// Estados que contam para o SLA de resolucao do time humano.
const ESTADOS_QUE_CONTAM = new Set(['fila_humana', 'em_atendimento']);
// Recebe os segmentos de estado do ticket, na ordem em que ocorreram.
// Cada segmento: { estado, inicio, fim } com timestamps em ms.
// Retorna o tempo (ms) sob responsabilidade do time, descontando
// bot ativo e aguardando cliente.
function tempoSobResponsabilidadeDoTime(segmentos) {
return segmentos.reduce((total, seg) => {
if (!ESTADOS_QUE_CONTAM.has(seg.estado)) return total;
const fim = seg.fim ?? Date.now(); // segmento aberto: conta ate agora
return total + Math.max(0, fim - seg.inicio);
}, 0);
}
// Verifica se o ticket cumpriu o SLA de resolucao.
function cumpriuSla(segmentos, slaMs) {
return tempoSobResponsabilidadeDoTime(segmentos) <= slaMs;
}
// Exemplo: SLA de 30 min (1800000 ms).
const segmentos = [
{ estado: 'bot_ativo', inicio: 0, fim: 120000 }, // 2 min, nao conta
{ estado: 'fila_humana', inicio: 120000, fim: 300000 }, // 3 min, conta
{ estado: 'em_atendimento', inicio: 300000, fim: 600000 }, // 5 min, conta
{ estado: 'aguardando_cliente', inicio: 600000, fim: 4200000 }, // 60 min, NAO conta
{ estado: 'em_atendimento', inicio: 4200000, fim: 4500000 }, // 5 min, conta
];
tempoSobResponsabilidadeDoTime(segmentos); // 780000 ms = 13 min
cumpriuSla(segmentos, 1800000); // true: 13 min <= 30 min
module.exports = { tempoSobResponsabilidadeDoTime, cumpriuSla };
Repare que o relogio bruto marcaria 75 minutos, mas o tempo justo e 13. Sem a pausa, esse ticket estouraria o SLA por culpa do cliente que sumiu por uma hora. O segredo e guardar cada transicao de estado com timestamp para reconstruir os segmentos depois.