reavaliarClienteSumiu.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // Reavalia atendimentos onde Sentimento="indefinido" (cliente parou de responder/sumiu no final),
  2. // após correção do prompt do juiz que penalizava indevidamente o atendente nesse cenário
  3. // (rubrica "cliente abandonado" confundia atendente abandonando o cliente com o inverso).
  4. //
  5. // Uso:
  6. // node scripts/reavaliarClienteSumiu.js --limite 20
  7. // node scripts/reavaliarClienteSumiu.js --score-max 4
  8. // node scripts/reavaliarClienteSumiu.js
  9. import "dotenv/config";
  10. import { Atendimento } from "../src/models/Atendimento.model.js";
  11. import { avaliarAtendimento } from "../src/services/atendimentoAvaliacaoService.js";
  12. const limiteIdx = process.argv.indexOf("--limite");
  13. const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null;
  14. const desdeIdx = process.argv.indexOf("--desde");
  15. const DESDE = desdeIdx > -1 ? process.argv[desdeIdx + 1] : null;
  16. const scoreMaxIdx = process.argv.indexOf("--score-max");
  17. const SCORE_MAX = scoreMaxIdx > -1 ? Number(process.argv[scoreMaxIdx + 1]) : null;
  18. async function main() {
  19. let query = Atendimento.query()
  20. .join("atendimento_avaliacoes as av", "av.AtendimentoId", "atendimentos.Id")
  21. .where("av.Avaliavel", true)
  22. .where("av.Sentimento", "indefinido")
  23. .select("atendimentos.Id", "atendimentos.Codigo")
  24. .orderBy("atendimentos.Id", "desc");
  25. if (DESDE) query = query.where("av.UpdatedAt", "<", DESDE);
  26. if (SCORE_MAX !== null) query = query.where("av.ScoreAtendente", "<=", SCORE_MAX);
  27. if (LIMITE) query = query.limit(LIMITE);
  28. const alvos = await query;
  29. const total = alvos.length;
  30. console.log(`[reavaliar-cliente-sumiu] iniciando: ${total} atendimentos`);
  31. let processados = 0;
  32. let erros = 0;
  33. const t0 = Date.now();
  34. for (const a of alvos) {
  35. try {
  36. await avaliarAtendimento(a.Id);
  37. } catch (err) {
  38. erros += 1;
  39. console.warn(`[reavaliar-cliente-sumiu] erro em ${a.Codigo}: ${err.message}`);
  40. } finally {
  41. processados += 1;
  42. if (processados % 25 === 0 || processados === total) {
  43. const s = Math.round((Date.now() - t0) / 1000);
  44. const ritmo = s / processados;
  45. const restamMin = Math.round(((total - processados) * ritmo) / 60);
  46. console.log(
  47. `[reavaliar-cliente-sumiu] progresso: ${processados}/${total} | erros: ${erros} | ${Math.round(s / 60)}min decorridos | ~${restamMin}min restantes`
  48. );
  49. }
  50. }
  51. }
  52. console.log(`[reavaliar-cliente-sumiu] concluído: ${processados}/${total} | erros: ${erros} | ${Math.round((Date.now() - t0) / 60000)}min total`);
  53. process.exit(0);
  54. }
  55. main().catch((err) => {
  56. console.error("[reavaliar-cliente-sumiu] falha fatal:", err);
  57. process.exit(1);
  58. });