reavaliarNovosVinculosErp.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import fs from "node:fs";
  2. import { avaliarAtendimento } from "../src/services/atendimentoAvaliacaoService.js";
  3. const arquivoIdx = process.argv.indexOf("--arquivo");
  4. const ARQUIVO = arquivoIdx > -1 ? process.argv[arquivoIdx + 1] : null;
  5. if (!ARQUIVO) {
  6. console.error("uso: node scripts/reavaliarNovosVinculosErp.js --arquivo <caminho.json> [--limite N] [--janela HH-HH]");
  7. process.exit(1);
  8. }
  9. const limiteIdx = process.argv.indexOf("--limite");
  10. const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null;
  11. const janelaIdx = process.argv.indexOf("--janela");
  12. const JANELA = janelaIdx > -1 ? process.argv[janelaIdx + 1] : null;
  13. const [JANELA_INICIO, JANELA_FIM] = JANELA ? JANELA.split("-").map(Number) : [null, null];
  14. function dentroDaJanela(inicioHora, fimHora) {
  15. const horaSp = Number(
  16. new Intl.DateTimeFormat("en-US", { timeZone: "America/Sao_Paulo", hour: "2-digit", hourCycle: "h23" }).format(new Date())
  17. );
  18. if (inicioHora <= fimHora) return horaSp >= inicioHora && horaSp < fimHora;
  19. return horaSp >= inicioHora || horaSp < fimHora;
  20. }
  21. async function aguardarJanela(inicioHora, fimHora) {
  22. let avisado = false;
  23. while (!dentroDaJanela(inicioHora, fimHora)) {
  24. if (!avisado) {
  25. console.log(`[reavaliar-novos-vinculos] fora da janela (${inicioHora}h-${fimHora}h) — pausado até reabrir`);
  26. avisado = true;
  27. }
  28. await new Promise((r) => setTimeout(r, 5 * 60 * 1000));
  29. }
  30. if (avisado) console.log("[reavaliar-novos-vinculos] janela reaberta, retomando");
  31. }
  32. async function main() {
  33. const novosVinculos = JSON.parse(fs.readFileSync(ARQUIVO, "utf8"));
  34. const alvos = LIMITE ? novosVinculos.slice(0, LIMITE) : novosVinculos;
  35. const total = alvos.length;
  36. console.log(`[reavaliar-novos-vinculos] iniciando: ${total} atendimentos (de ${ARQUIVO})`);
  37. let processados = 0;
  38. let erros = 0;
  39. const t0 = Date.now();
  40. for (const a of alvos) {
  41. if (JANELA) await aguardarJanela(JANELA_INICIO, JANELA_FIM);
  42. try {
  43. await avaliarAtendimento(a.Id);
  44. } catch (err) {
  45. erros += 1;
  46. console.warn(`[reavaliar-novos-vinculos] erro em ${a.Codigo}: ${err.message}`);
  47. } finally {
  48. processados += 1;
  49. if (processados % 25 === 0 || processados === total) {
  50. const s = Math.round((Date.now() - t0) / 1000);
  51. const ritmo = s / processados;
  52. const restamMin = Math.round(((total - processados) * ritmo) / 60);
  53. console.log(
  54. `[reavaliar-novos-vinculos] progresso: ${processados}/${total} | erros: ${erros} | ${Math.round(s / 60)}min decorridos | ~${restamMin}min restantes`
  55. );
  56. }
  57. }
  58. }
  59. console.log(`[reavaliar-novos-vinculos] concluído: ${processados}/${total} | erros: ${erros} | ${Math.round((Date.now() - t0) / 60000)}min total`);
  60. process.exit(0);
  61. }
  62. main().catch((err) => {
  63. console.error("[reavaliar-novos-vinculos] falha fatal:", err);
  64. process.exit(1);
  65. });