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>
158 lines
5.1 KiB
JavaScript
158 lines
5.1 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import { describe, it } from 'node:test';
|
|
import {
|
|
buildNextQuestion,
|
|
detectService,
|
|
normalizePhone,
|
|
processLead
|
|
} from '../src/lead-engine.mjs';
|
|
|
|
describe('lead engine', () => {
|
|
it('normaliza telefone brasileiro para formato internacional', () => {
|
|
assert.equal(normalizePhone('(75) 99999-1111'), '5575999991111');
|
|
assert.equal(normalizePhone('+55 75 99999-1111'), '5575999991111');
|
|
});
|
|
|
|
it('detecta servico por texto livre', () => {
|
|
assert.equal(detectService('quero trocar meu sistema de estoque'), 'erp');
|
|
assert.equal(detectService('preciso de suporte em servidor e backup'), 'ti');
|
|
assert.equal(detectService('automatizar atendimento no WhatsApp'), 'whatsapp');
|
|
});
|
|
|
|
it('prioriza lead com WhatsApp para tratamento manual', () => {
|
|
const result = processLead({
|
|
source: 'site',
|
|
contact: { name: 'Carlos Souza', phone: '(75) 99999-1111', email: 'carlos@mercado.com' },
|
|
company: {
|
|
name: 'Mercado Sao Joao',
|
|
city: 'Santo Antonio de Jesus',
|
|
state: 'BA',
|
|
segment: 'mercado',
|
|
employees: 18
|
|
},
|
|
interest: 'ERP',
|
|
current_system: 'uso outro sistema, mas quero trocar',
|
|
pains: ['estoque', 'financeiro', 'emissao fiscal'],
|
|
urgency: 'alta',
|
|
consent: true
|
|
});
|
|
|
|
assert.equal(result.lead.service, 'erp');
|
|
assert.equal(result.priority.priority, 'com_whatsapp');
|
|
assert.equal(result.priority.hasWhatsapp, true);
|
|
assert.ok(result.whatsapp.internal.message.includes('Novo lead captado - COM WHATSAPP'));
|
|
assert.equal(result.nextAction, 'tratamento_manual');
|
|
});
|
|
|
|
it('mantem lead de TI com dados parciais como captado', () => {
|
|
const result = processLead({
|
|
origem: 'indicacao',
|
|
nome: 'Ana Lima',
|
|
telefone: '75988887777',
|
|
empresa: 'Clinica Vida',
|
|
cidade: 'Santo Antonio de Jesus',
|
|
uf: 'BA',
|
|
segmento: 'clinica',
|
|
servico: 'gestao de TI',
|
|
computadores: 8,
|
|
dor: 'backup; suporte tecnico',
|
|
urgencia: 'media'
|
|
});
|
|
|
|
assert.equal(result.lead.service, 'ti');
|
|
assert.equal(result.priority.priority, 'com_whatsapp');
|
|
assert.ok(result.crmRecord.whatsapp.startsWith('55'));
|
|
});
|
|
|
|
it('mantem lead sem WhatsApp abaixo na prioridade', () => {
|
|
const result = processLead({
|
|
name: 'Lead Sem Servico',
|
|
message: 'quero mais informacoes'
|
|
});
|
|
|
|
assert.equal(result.lead.service, 'indefinido');
|
|
assert.equal(result.priority.priority, 'sem_whatsapp');
|
|
assert.equal(result.priority.hasWhatsapp, false);
|
|
assert.ok(buildNextQuestion(result.lead).includes('1 - Sistema ERP'));
|
|
});
|
|
|
|
it('reconhece segmentos compostos da prospeccao automatica como segmento-alvo', () => {
|
|
const compostos = processLead({
|
|
name: 'Lead Prospeccao',
|
|
whatsapp: '75999993333',
|
|
company_name: 'Restaurante Sabor da Terra',
|
|
city: 'Amargosa',
|
|
state: 'BA',
|
|
segment: 'restaurante_pizzaria'
|
|
});
|
|
assert.equal(compostos.lead.isTargetSegment, true);
|
|
|
|
const materialConstrucao = processLead({
|
|
name: 'Lead Prospeccao',
|
|
whatsapp: '75999994444',
|
|
company_name: 'Deposito Central',
|
|
segment: 'material_construcao_cimento_blocos'
|
|
});
|
|
assert.equal(materialConstrucao.lead.isTargetSegment, true);
|
|
|
|
const clinica = processLead({
|
|
name: 'Lead Prospeccao',
|
|
whatsapp: '75999995555',
|
|
company_name: 'Clinica Odonto Vida',
|
|
segment: 'clinica_laboratorio_odonto_otica'
|
|
});
|
|
assert.equal(clinica.lead.isTargetSegment, true);
|
|
});
|
|
|
|
it('nao marca como segmento-alvo um segmento fora da lista', () => {
|
|
const result = processLead({
|
|
name: 'Lead Prospeccao',
|
|
whatsapp: '75999996666',
|
|
company_name: 'Posto Boa Vista',
|
|
segment: 'posto_combustivel'
|
|
});
|
|
assert.equal(result.lead.isTargetSegment, false);
|
|
});
|
|
|
|
it('reconhece os novos nichos (beleza, celulares, transportadora) como segmento-alvo', () => {
|
|
const beleza = processLead({
|
|
name: 'Lead Prospeccao',
|
|
whatsapp: '75999997777',
|
|
company_name: 'Studio Beleza Bahia',
|
|
segment: 'beleza_estetica_barbearia'
|
|
});
|
|
assert.equal(beleza.lead.isTargetSegment, true);
|
|
|
|
const celulares = processLead({
|
|
name: 'Lead Prospeccao',
|
|
whatsapp: '75999998888',
|
|
company_name: 'Cell Center',
|
|
segment: 'celulares_eletronicos_assistencia'
|
|
});
|
|
assert.equal(celulares.lead.isTargetSegment, true);
|
|
|
|
const transportadora = processLead({
|
|
name: 'Lead Prospeccao',
|
|
whatsapp: '75999999999',
|
|
company_name: 'Transportadora Recôncavo',
|
|
segment: 'transportadora_logistica'
|
|
});
|
|
assert.equal(transportadora.lead.isTargetSegment, true);
|
|
});
|
|
|
|
it('direciona lead de WhatsApp para pergunta de volume quando a dor ja existe', () => {
|
|
const result = processLead({
|
|
name: 'Mariana',
|
|
whatsapp: '75999992222',
|
|
company_name: 'Restaurante Sabor',
|
|
city: 'Santo Antonio de Jesus',
|
|
state: 'BA',
|
|
interest: 'autoatendimento WhatsApp',
|
|
pains: ['pedidos', 'triagem']
|
|
});
|
|
|
|
assert.equal(result.lead.service, 'whatsapp');
|
|
assert.ok(buildNextQuestion(result.lead).includes('quantas mensagens'));
|
|
});
|
|
});
|