// Corrige retroativamente avaliações que violam a regra de piso do juiz: // Resolvido="sim" + Sentimento="positivo" nunca deveriam ter ScoreAtendente < 6 // (mesma regra agora imposta em código por aplicarPisoScore, em atendimentoAvaliacaoService.js). // Idempotente: rodar de novo depois de aplicado não encontra mais linhas. // // Uso: // node scripts/corrigirPisoScoreAvaliacoes.js # dry-run // node scripts/corrigirPisoScoreAvaliacoes.js --apply # aplica // node scripts/corrigirPisoScoreAvaliacoes.js --apply --expect-count 50 # trava de segurança import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { AtendimentoAvaliacao } from "../src/models/AtendimentoAvaliacao.model.js"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const APLICAR = process.argv.includes("--apply"); const expectIdx = process.argv.indexOf("--expect-count"); const EXPECT_COUNT = expectIdx > -1 ? Number(process.argv[expectIdx + 1]) : null; const SCORE_MINIMO = 6; async function main() { const linhas = await AtendimentoAvaliacao.query() .where("Resolvido", "sim") .where("Sentimento", "positivo") .whereNotNull("ScoreAtendente") .where("ScoreAtendente", "<", SCORE_MINIMO) .select("AtendimentoId", "ScoreAtendente", "JustificativaScore", "UpdatedAt"); console.log(`[backfill-piso-score] ${linhas.length} avaliações violam a regra de piso.`); linhas.forEach((l) => console.log(` #${l.AtendimentoId} score ${l.ScoreAtendente} -> ${SCORE_MINIMO} | ${(l.JustificativaScore ?? "").slice(0, 80)}`) ); if (EXPECT_COUNT !== null && linhas.length !== EXPECT_COUNT) { console.error(`[backfill-piso-score] abortando: esperava ${EXPECT_COUNT} linhas, achei ${linhas.length}.`); process.exit(1); } if (!APLICAR) { console.log("[backfill-piso-score] dry-run (nenhuma alteração feita). Use --apply para aplicar."); process.exit(0); } if (linhas.length === 0) { console.log("[backfill-piso-score] nada para corrigir."); process.exit(0); } const backupDir = path.resolve(__dirname, "logs"); fs.mkdirSync(backupDir, { recursive: true }); const backupPath = path.join(backupDir, `backfill-piso-score-${new Date().toISOString().replace(/[:.]/g, "-")}.json`); fs.writeFileSync(backupPath, JSON.stringify(linhas, null, 2)); console.log(`[backfill-piso-score] backup salvo em ${backupPath}`); const ids = linhas.map((l) => l.AtendimentoId); const afetados = await AtendimentoAvaliacao.query() .whereIn("AtendimentoId", ids) .patch({ ScoreAtendente: SCORE_MINIMO }); // UpdatedAt propositalmente não é tocado console.log(`[backfill-piso-score] ${afetados} linhas atualizadas para score ${SCORE_MINIMO}.`); process.exit(0); } main().catch((e) => { console.error("[backfill-piso-score] falha:", e.message); process.exit(1); });