function normalizeTicket(row, extras) { const followups = (extras && extras.followups) || []; const tasks = (extras && extras.tasks) || []; return { id: Number(row.id), titulo: row.titulo, status: Number(row.status), status_nome: row.status_nome, aberto_em: row.aberto_em, ultima_interacao_em: row.ultima_interacao_em, dias_aberto: Number(row.dias_aberto), dias_sem_interacao: Number(row.dias_sem_interacao), sla_vencido: Number(row.sla_vencido) === 1, sla_em_risco: Number(row.sla_em_risco) === 1, horas_ate_sla: row.horas_ate_sla == null ? null : Number(row.horas_ate_sla), prioridade: Number(row.prioridade), urgencia: Number(row.urgencia), impacto: Number(row.impacto), entidade: row.entidade, categoria: row.categoria, tecnico_atribuido: row.tecnico_atribuido, sem_tecnico: Number(row.sem_tecnico) === 1, link_glpi: row.link_glpi, score_criticidade: Number(row.score_criticidade), followups, tasks, }; } function truncate(text, maxChars) { const clean = String(text || '').replace(/\s+/g, ' ').trim(); return clean.length > maxChars ? `${clean.slice(0, Math.max(0, maxChars - 3))}...` : clean; } function buildAiContextText(ticket, maxChars) { const budget = Math.max(200, Number(maxChars) || 4000); const followupsText = ticket.followups .slice(-5) .map((f) => `- [followup ${f.date}] ${truncate(f.texto, 300)}`) .join('\n'); const tasksText = ticket.tasks .slice(-5) .map((t) => `- [tarefa ${t.date} status=${t.status}] ${truncate(t.texto, 300)}`) .join('\n'); const header = [ `Chamado #${ticket.id} - ${ticket.titulo}`, `Status: ${ticket.status_nome} | Categoria: ${ticket.categoria} | Entidade: ${ticket.entidade}`, `Tecnico: ${ticket.tecnico_atribuido}`, `Prioridade: ${ticket.prioridade} Urgencia: ${ticket.urgencia} Impacto: ${ticket.impacto}`, `SLA vencido: ${ticket.sla_vencido} | Dias sem interacao: ${ticket.dias_sem_interacao} | Dias aberto: ${ticket.dias_aberto}`, ].join('\n'); const body = [ 'Ultimos apontamentos:', followupsText || '(nenhum)', '', 'Ultimas tarefas:', tasksText || '(nenhuma)', ].join('\n'); return truncate(`${header}\n\n${body}`, budget); } module.exports = { normalizeTicket, buildAiContextText, truncate };