import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { AtendimentoAvaliacao } from "../src/models/AtendimentoAvaliacao.model.js"; import { AtendimentoMensagem } from "../src/models/AtendimentoMensagem.model.js"; import { contarPendentes } from "../src/services/atendimentoAvaliacaoService.js"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const APLICAR = process.argv.includes("--apply"); const limiteIdx = process.argv.indexOf("--limite"); const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null; const SENTINELS = ["__processando__", "__erro__"]; async function buscarCandidatos() { const rows = await AtendimentoAvaliacao.query() .where("atendimento_avaliacoes.Avaliavel", true) .join(AtendimentoMensagem.tableName + " as m", "m.AtendimentoId", "atendimento_avaliacoes.AtendimentoId") .whereIn("m.Transcricao", SENTINELS) .whereRaw("atendimento_avaliacoes.UltimaMensagemId >= m.Id") .select( "atendimento_avaliacoes.AtendimentoId", "atendimento_avaliacoes.ScoreAtendente", "atendimento_avaliacoes.UltimaMensagemId" ) .distinct("atendimento_avaliacoes.AtendimentoId") .orderBy("atendimento_avaliacoes.AtendimentoId"); return rows; } async function main() { const candidatos = await buscarCandidatos(); const alvos = LIMITE ? candidatos.slice(0, LIMITE) : candidatos; console.log(`[backfill-transcricao-sentinel] ${candidatos.length} atendimentos avaliados com sentinel no texto.`); console.log(`[backfill-transcricao-sentinel] ${alvos.length} avaliações serão resetadas para pendente${LIMITE ? ` (--limite ${LIMITE})` : ""}.`); if (!APLICAR) { console.log("[backfill-transcricao-sentinel] dry-run (nenhuma alteração feita). Use --apply para executar."); process.exit(0); } if (alvos.length === 0) { console.log("[backfill-transcricao-sentinel] nada para reavaliar."); process.exit(0); } const backupDir = path.resolve(__dirname, "logs"); fs.mkdirSync(backupDir, { recursive: true }); const backupPath = path.join(backupDir, `backfill-transcricao-sentinel-${new Date().toISOString().replace(/[:.]/g, "-")}.json`); fs.writeFileSync(backupPath, JSON.stringify(alvos, null, 2)); console.log(`[backfill-transcricao-sentinel] backup dos valores antigos salvo em ${backupPath}`); const ids = alvos.map((a) => a.AtendimentoId); const pendentesAntes = await contarPendentes(); await AtendimentoAvaliacao.query().whereIn("AtendimentoId", ids).patch({ UltimaMensagemId: null }); const pendentesDepois = await contarPendentes(); console.log(`[backfill-transcricao-sentinel] resetados ${ids.length} — fila de pendentes ${pendentesAntes} -> ${pendentesDepois}.`); console.log("[backfill-transcricao-sentinel] pronto. Agora rode scripts/avaliarTudo.js para drenar a fila."); process.exit(0); } main().catch((e) => { console.error("[backfill-transcricao-sentinel] falha:", e.message); process.exit(1); });