import fs from "node:fs"; import { avaliarAtendimento } from "../src/services/atendimentoAvaliacaoService.js"; const arquivoIdx = process.argv.indexOf("--arquivo"); const ARQUIVO = arquivoIdx > -1 ? process.argv[arquivoIdx + 1] : null; if (!ARQUIVO) { console.error("uso: node scripts/reavaliarNovosVinculosErp.js --arquivo [--limite N] [--janela HH-HH]"); process.exit(1); } const limiteIdx = process.argv.indexOf("--limite"); const LIMITE = limiteIdx > -1 ? Number(process.argv[limiteIdx + 1]) : null; const janelaIdx = process.argv.indexOf("--janela"); const JANELA = janelaIdx > -1 ? process.argv[janelaIdx + 1] : null; const [JANELA_INICIO, JANELA_FIM] = JANELA ? JANELA.split("-").map(Number) : [null, null]; function dentroDaJanela(inicioHora, fimHora) { const horaSp = Number( new Intl.DateTimeFormat("en-US", { timeZone: "America/Sao_Paulo", hour: "2-digit", hourCycle: "h23" }).format(new Date()) ); if (inicioHora <= fimHora) return horaSp >= inicioHora && horaSp < fimHora; return horaSp >= inicioHora || horaSp < fimHora; } async function aguardarJanela(inicioHora, fimHora) { let avisado = false; while (!dentroDaJanela(inicioHora, fimHora)) { if (!avisado) { console.log(`[reavaliar-novos-vinculos] fora da janela (${inicioHora}h-${fimHora}h) — pausado até reabrir`); avisado = true; } await new Promise((r) => setTimeout(r, 5 * 60 * 1000)); } if (avisado) console.log("[reavaliar-novos-vinculos] janela reaberta, retomando"); } async function main() { const novosVinculos = JSON.parse(fs.readFileSync(ARQUIVO, "utf8")); const alvos = LIMITE ? novosVinculos.slice(0, LIMITE) : novosVinculos; const total = alvos.length; console.log(`[reavaliar-novos-vinculos] iniciando: ${total} atendimentos (de ${ARQUIVO})`); let processados = 0; let erros = 0; const t0 = Date.now(); for (const a of alvos) { if (JANELA) await aguardarJanela(JANELA_INICIO, JANELA_FIM); try { await avaliarAtendimento(a.Id); } catch (err) { erros += 1; console.warn(`[reavaliar-novos-vinculos] erro em ${a.Codigo}: ${err.message}`); } finally { processados += 1; if (processados % 25 === 0 || processados === total) { const s = Math.round((Date.now() - t0) / 1000); const ritmo = s / processados; const restamMin = Math.round(((total - processados) * ritmo) / 60); console.log( `[reavaliar-novos-vinculos] progresso: ${processados}/${total} | erros: ${erros} | ${Math.round(s / 60)}min decorridos | ~${restamMin}min restantes` ); } } } console.log(`[reavaliar-novos-vinculos] concluído: ${processados}/${total} | erros: ${erros} | ${Math.round((Date.now() - t0) / 60000)}min total`); process.exit(0); } main().catch((err) => { console.error("[reavaliar-novos-vinculos] falha fatal:", err); process.exit(1); });