Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> git-subtree-dir: gti-maquina-comercial git-subtree-mainline:93ca82979egit-subtree-split:b77484946f
66 lines
2.6 KiB
JavaScript
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
|
|
};
|
|
}
|