| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- // 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);
- });
|