App local (Node + SQLite) para captura, tratamento e exportacao de leads comerciais, com dashboard de gestao, login/usuarios e integracao Z-PRO. Co-Authored-By: Claude <noreply@anthropic.com>
77 lines
2.6 KiB
JavaScript
77 lines
2.6 KiB
JavaScript
import path from 'node:path';
|
|
import { loadDotEnv, paths } from '../src/env.mjs';
|
|
import { openDb, ensureSeeds } from '../src/db.mjs';
|
|
import { extractUf } from '../src/extract/rfb-extractor.mjs';
|
|
|
|
// Extrai a base CNPJ de uma UF inteira a partir dos zips da Receita Federal:
|
|
// node scripts/extrair-base-cnpj.mjs --uf=BA
|
|
// Pre-requisito: zips baixados em prospeccao/cnpj/rfb-raw (scripts/baixar-base-rfb.sh).
|
|
|
|
await loadDotEnv();
|
|
|
|
const args = new Map(
|
|
process.argv.slice(2).map((arg) => {
|
|
const [key, value = 'true'] = arg.replace(/^--/, '').split('=');
|
|
return [key, value];
|
|
})
|
|
);
|
|
|
|
const uf = (args.get('uf') || '').toUpperCase();
|
|
if (!/^[A-Z]{2}$/.test(uf)) {
|
|
console.error('Uso: node scripts/extrair-base-cnpj.mjs --uf=BA');
|
|
process.exit(1);
|
|
}
|
|
|
|
const rawDir = args.get('raw-dir') || paths.rfbRaw;
|
|
const outCsv = path.join(paths.cnpjDir, `estabelecimentos-${uf}.csv`);
|
|
const checkpointPath = path.join(paths.cnpjDir, `checkpoint-estabelecimentos-${uf}.ndjson`);
|
|
|
|
async function main() {
|
|
const db = openDb();
|
|
await ensureSeeds(db, { log: (m) => console.log(`[extrair] ${m}`) });
|
|
|
|
const inserted = db.prepare(
|
|
"INSERT INTO extractions (uf, status, started_at) VALUES (?, 'running', datetime('now'))"
|
|
).run(uf);
|
|
const extractionId = Number(inserted.lastInsertRowid);
|
|
db.prepare('UPDATE extractions SET pid = ? WHERE id = ?').run(process.pid, extractionId);
|
|
|
|
try {
|
|
const result = await extractUf({
|
|
uf,
|
|
rawDir,
|
|
outCsv,
|
|
checkpointPath,
|
|
db,
|
|
log: (m) => console.log(`[extrair] ${m}`),
|
|
onProgress: (p) => {
|
|
console.log(`[extrair] ${p.pct}% ${p.phase}: ${p.message}`);
|
|
db.prepare('UPDATE extractions SET progress_json = ? WHERE id = ?')
|
|
.run(JSON.stringify(p), extractionId);
|
|
}
|
|
});
|
|
|
|
if (result.cancelled) {
|
|
db.prepare("UPDATE extractions SET status = 'cancelled', finished_at = datetime('now') WHERE id = ?")
|
|
.run(extractionId);
|
|
} else {
|
|
db.prepare(
|
|
`UPDATE extractions SET status = 'done', csv_path = ?, total_rows = ?, with_phone = ?,
|
|
municipios_count = ?, finished_at = datetime('now') WHERE id = ?`
|
|
).run(result.csvPath, result.totalRows, result.withPhone, result.municipiosCount, extractionId);
|
|
}
|
|
} catch (error) {
|
|
db.prepare(
|
|
"UPDATE extractions SET status = 'error', error = ?, finished_at = datetime('now') WHERE id = ?"
|
|
).run(String(error.message || error), extractionId);
|
|
throw error;
|
|
} finally {
|
|
db.close();
|
|
}
|
|
}
|
|
|
|
main().catch((error) => {
|
|
console.error(`[extrair] erro: ${error.stack || error.message}`);
|
|
process.exit(1);
|
|
});
|