viabiliza/public/main.js
gabriel.pereira b3bca576da REFACTOR: Remoção de serviços obsoletos e implementação da nova funcionalidade de viabilidade pela API de contratação
- Removidos os arquivos não utilizados: fetchService, geocodeService, normalizeService e retryService.

- Adicionado o viabilidadeController para gerenciar consultas de viabilidade e upload de arquivos CSV.

- Criadas as viabilidadeRoutes para tratar as rotas da API relacionadas à viabilidade.

- Implementado o csvService para processamento de arquivos CSV e integração com as consultas de viabilidade.

- Criado o jobStore.service para gerenciamento do estado dos jobs durante o processamento do CSV.

- Desenvolvido o viabilidadeService para integração com a API de viabilidade.
2025-12-30 09:16:07 -03:00

122 lines
4.1 KiB
JavaScript

document.getElementById('uploadForm').addEventListener('submit', async (e) => {
e.preventDefault();
const fileEl = document.getElementById('csvfile');
if (!fileEl.files.length) return;
const fd = new FormData();
fd.append('csvfile', fileEl.files[0]);
const resEl = document.getElementById('uploadResult');
resEl.innerText = 'Enviando...';
try {
const resp = await fetch('/upload', { method: 'POST', body: fd });
const data = await resp.json();
if (data.jobId) {
// show progress bar
document.getElementById('progressWrap').style.display = 'block';
pollJob(data.jobId);
resEl.innerText = `Consultando viabilidade...`;
} else if (data.error) {
resEl.innerText = 'Erro: ' + data.error;
}
} catch (e) {
resEl.innerText = 'Erro no upload';
}
});
async function pollJob(jobId) {
const resEl = document.getElementById('uploadResult');
const bar = document.getElementById('progressBar');
try {
const resp = await fetch(`/status/${jobId}`);
const j = await resp.json();
if (j.total && j.total > 0) {
const pct = Math.round((j.processed / j.total) * 100);
bar.style.width = pct + '%';
bar.innerText = `${pct}%`;
}
if (j.status === 'done') {
bar.style.width = '100%';
bar.innerText = '100%';
resEl.innerHTML = `Concluído. <a href="${j.download}">Baixar CSV processado</a>`;
return;
}
if (j.status === 'error') {
resEl.innerText = 'Erro no processamento: ' + j.error;
return;
}
// ainda processando
setTimeout(() => pollJob(jobId), 1000);
} catch (e) {
resEl.innerText = 'Erro ao consultar status do job';
}
}
document.getElementById('btnConsultaCep').addEventListener('click', async () => {
const cep = document.getElementById('cep').value;
const numero = document.getElementById('numero').value;
const el = document.getElementById('consultaResult');
el.innerText = 'Consultando...';
try {
// usar fetch ao invés de axios para evitar dependência no cliente
const resp = await fetch('/viabilidade', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ cep, numero })
});
if (!resp.ok) {
const text = await resp.text().catch(() => '');
throw new Error(`Status ${resp.status} ${text}`);
}
const data = await resp.json();
if (data.distancia) {
el.innerText = `Endereço: ${data.logradouro}, ${data.bairro}, ${data.cidade}/${data.estado}, ${data.cep}\nDistância: ${data.distancia}`;
} else if (data.error) {
el.innerText = 'Erro: ' + data.error;
} else {
el.innerText = 'Resposta inesperada da API';
console.log('Resposta completa:', data);
}
} catch (e) {
console.error(e);
el.innerText = 'Erro na consulta: ' + (e.message || e);
}
});
// baixar modelo
// botão que inicia download de todos os modelos individualmente
document.addEventListener("DOMContentLoaded", () => {
const btn = document.getElementById("card__button-download");
if (!btn) return;
btn.addEventListener("click", async (e) => {
e.preventDefault();
try {
const resp = await fetch("/download-models/list");
if (!resp.ok) throw new Error("Não foi possível obter lista de modelos");
const data = await resp.json();
const files = data.files || [];
if (!files.length) {
alert("Nenhum arquivo de modelo disponível");
return;
}
// Para cada arquivo, cria um <a> e clica nele para iniciar download individual
files.forEach((fname) => {
const url = "/download-model/" + encodeURIComponent(fname);
const a = document.createElement("a");
a.href = url;
a.download = fname;
// necessário anexar no DOM para funcionar em alguns navegadores
document.body.appendChild(a);
a.click();
a.remove();
});
} catch (err) {
console.error("Erro ao baixar modelos:", err);
alert("Erro ao iniciar downloads: " + (err.message || err));
}
});
});