Tracks the app that was already in place (capture, treatment, outreach, WhatsApp integration, server, frontend, tests, docs) so future feature work can branch and use isolated worktrees.
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'));
|
|
});
|
|
});
|