Files
COMERCIAL-GTI/gti-maquina-comercial/src/capture/lead-row.mjs
T
GustavoandClaude Sonnet 5 f5af038e19 chore: import gti-maquina-comercial history via subtree
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

git-subtree-dir: gti-maquina-comercial
git-subtree-mainline: 93ca82979e
git-subtree-split: b77484946f
2026-09-28 15:50:08 -03:00

66 lines
2.6 KiB
JavaScript

import {
scoreQualidade, scoreComercial, scoreGeral, classificarScoreGeral,
dedupKey, extractDdd, segmentLabel, onlyDigits
} from '../scoring.mjs';
// Converte um item processado ({payload, lead}) — formato produzido por
// processLead e tambem o formato dos JSONs legados — na linha canonica da
// tabela leads, com os scores/classificacao/dedup_key calculados.
export function leadRowFromProcessed(item, fallbackOrigin = '') {
const lead = item.lead || {};
const prospecting = item.payload?.prospecting || lead.raw?.prospecting || {};
const empresa = String(lead.companyName ?? '').trim();
const whatsapp = onlyDigits(lead.phone);
const cnpj = onlyDigits(prospecting.cnpj);
const cidade = String(lead.city ?? '').trim();
const segmento = String(lead.segment ?? '').trim();
const cnae = String(prospecting.cnae ?? '').trim();
const website = String(prospecting.website ?? '').trim();
const email = String(lead.email ?? '').trim();
const affinity = prospecting.affinity || 'media';
const produtos = Array.isArray(prospecting.products) ? prospecting.products : [];
const qualidade = scoreQualidade({ whatsapp, cnpj, empresa, cidade, segmento, cnae, website });
const comercial = scoreComercial({ whatsapp, cnpj, website, email, affinity });
const geral = scoreGeral(qualidade.score, comercial);
const tier = classificarScoreGeral(geral);
const produtoPrincipal = produtos.length
? [...produtos].sort((a, b) => b.estrelas - a.estrelas)[0].nome
: '';
return {
lead_uid: lead.id || null,
dedup_key: dedupKey({ cnpj, whatsapp, empresa, cidade }),
empresa,
legal_name: String(prospecting.legal_name ?? ''),
whatsapp,
ddd: extractDdd(whatsapp),
email,
cidade,
uf: String(lead.state ?? '').trim().toUpperCase(),
segmento,
segmento_label: segmentLabel(segmento),
interesse: String(lead.serviceLabel ?? ''),
cnpj,
cnae,
endereco: String(prospecting.address ?? ''),
website,
pains_json: JSON.stringify(lead.pains || []),
origem: String(lead.source || fallbackOrigin || 'indefinida'),
telefone_valido: qualidade.telefoneValido ? 1 : 0,
cnpj_valido: qualidade.cnpjValido ? 1 : 0,
empresa_valida: qualidade.empresaValida ? 1 : 0,
score: geral,
classificacao: tier.id,
motivo_classificacao: `score geral ${geral} (qualidade ${qualidade.score}, comercial ${comercial})`,
score_qualidade: qualidade.score,
score_comercial: comercial,
prioridade: tier.prioridade,
produto_principal: produtoPrincipal,
produtos_json: JSON.stringify(produtos),
capture_run_id: null,
captured_at: lead.createdAt || null,
exported_at: null
};
}