Pular para o conteúdo principal

Análise técnica do CRM

Revisão do código local em 07/10/2026, com leitura da arquitetura geral e análise detalhada do CRM. O fluxo principal tem modelos e endpoints para captação, qualificação, conversão, oportunidades, atividades, automações e relatórios. As maiores lacunas estão na conexão entre contratos da interface, validação HTTP e acionamentos de automação.

Escopo da validação: leitura de rotas, schemas, controllers, políticas, jobs, serviços e templates; execução dos testes unitários existentes dos domínios de CRM; compilação dos componentes reais para capturas locais. Não foram usadas contas, bancos ou provedores de produção. Os cenários dos prints retornam dados fictícios e não exercitam middlewares da API.

Prioridades de correção​

As prioridades abaixo são propostas desta análise. “Bloqueio” indica incompatibilidade objetiva no código; “risco” exige validação adicional com ambiente e dados controlados.

PrioridadeAchado e evidênciaImpactoCorreção sugerida
Alta — bloqueioLeadsPage.saveLead() envia consent; Lead/validations.js:add() não o aceitaCadastro manual pode falhar por campo desconhecido, mesmo com checkbox desmarcadoUnificar schema/controller e registrar consentimento com prova, como na captura pública
Alta — bloqueioCrmService.moveDealToPipeline() chama /deal/:id/pipeline; Deal/routes.js não monta essa rotaO botão de transferência não completa o fluxoImplementar rota com validação de empresa, etapa, permissão e histórico, ou ocultar a ação até estar disponível
Alta — bloqueioLeadPage permite salvar dados de convertido; Lead/controller.js:update() recusa qualquer convertidoMensagem da tela promete uma edição que o backend impedeDefinir campos editáveis pós-conversão e alinhar tela, schema e controller
Alta — risco de enviodeal_stalled e lead_created existem em editor/schema; só cart_abandoned tem acionador localizadoEventos selecionáveis podem nunca inscrever contatosImplementar acionamento idempotente ou retirar as opções até completar o fluxo
Alta — risco de envioCadence/reply.js exige outcome; registro rápido em crm.page.ts não o enviaUma conversa registrada não encerra a cadência nem alimenta a resposta A/BCapturar resultado estruturado e vincular lead/negócio na atividade
Alta — risco de envioDeal/controller.js:win/lose não chama encerramento de inscrições; executor não testa resultado fechadoMensagens podem continuar após decisão comercialEncerrar inscrições por lead/negócio no fechamento e adicionar defesa no executor
Alta — bloqueio de integraçãosrc/routes.js consome JSON antes do parser verify em Lead/webhook.jsreq.rawBody ausente pode invalidar assinaturas legítimasPreservar bytes antes de parsear e testar a rota HTTP completa
Alta — risco de consentimentoInscrição via negócio sem lead e carrinho com cliente sem lead não têm a mesma verificação de aceite do caminho de leadCanais automáticos podem escapar da regra de consentimento aplicada aos leadsDefinir fonte de consentimento para todos os alvos e bloquear na inscrição e execução
Alta — risco de isolamentoPolíticas customizadas de Lead/Deal/Pipeline/Cadence/Segment/Activity retornam permitido quando não resolvem ID da entidade; várias listas aceitam business opcionalAutorização de leitura não comprova isolamento da empresa nas consultasDerivar escopo do perfil no servidor e validar listas, relatório e vínculos com duas empresas em testes de integração
Alta — risco de vínculoDeal.add() verifica cliente/funil, mas não consulta o lead recebido; Lead.convert() carrega pipeline por ID sem comparação explícita da empresaIDs de outra empresa podem criar relações comerciais incoerentesValidar empresa de cada referência antes da gravação, incluindo lead, dono e produto
Alta — risco transacionalTransação começa antes dos guards; respostas de negação retornam sem alcançar commit/abort; controllers enviam sucesso antes do commitSessões podem ficar sem encerramento e o cliente pode ver sucesso antes de confirmar persistênciaGerenciar sessão em bloco com finalização garantida e enviar sucesso após commit
Média — consistênciaActivitiesPage.complete() classifica contador por horário vencido, enquanto a API define buckets por início/fim do diaContadores errados ao concluir item de hoje já vencido ou futuroUsar o bucket selecionado ou consultar os contadores de novo
Média — históricoEditor envia etapas sem playbook; controller substitui pipeline.stagesSalvar o funil pela interface pode apagar roteiros existentesPreservar campos não editados ou expor editor para eles
Média — históricoProteção de remoção de etapa conta só negócios abertosEtapas usadas apenas em registros fechados podem sumir do desenho do relatórioManter etapas históricas ou permitir arquivamento com referência preservada
Média — projeçãoshiftSummary() ajusta só quantidade e valor, não estagnação e ausência de açãoResumo do quadro pode ficar desatualizado após arrasteReconsultar o resumo ou ajustar todas as métricas retornadas
Média — entregaCadence/schedule.js avança currentStep também com resultado failed ou skippedFalha não é reenviada automaticamente; fim da sequência pode incluir toques não entreguesPolítica explícita de retry, idempotência e exibição de falhas
Média — atribuiçãoRelatório lê source.lastTouch atual do lead, sem snapshot de fechamentoRecaptura posterior pode alterar o crédito de uma venda antigaGuardar origem atribuída no fechamento ou trilha temporal de toques
Média — escalaRecálculo ordena por score.updatedAt e só grava quando números mudamLote estável de até 500 pode voltar sempre e atrasar leads fora delePersistir momento de avaliação ou usar cursor de lotes
Média — consistênciaDeduplicação busca antes de criar; índices de contato não são únicosCapturas simultâneas podem duplicar contatosResolver concorrência com chave normalizada/idempotência e estratégia de merge

As políticas e autorização do projeto são mecanismos reais, mas os riscos de escopo acima não foram explorados contra dados de outras empresas. Devem ser verificados em homologação isolada antes de afirmar o alcance de exposição.

Comportamentos que a documentação anterior superestimava​

Afirmação anteriorO que o código revisado sustenta
Lead qualificado vira negócio e ganho vira clienteQualificação, conversão, criação de negócio e ganho são operações separadas
Qualquer resposta encerra cadênciaSó atividade com tipo e outcome reconhecidos; a UI rápida não informa esse resultado
Ganho, perda e opt-out encerram tudo imediatamenteGanho/perda não encerram inscrições gerais; opt-out atualiza aceite e o executor reage nos próximos passos automáticos
A/B alterna variantes e mede conversão de vendaExecutor usa sorteio ponderado; relatório mede respostas por envio
Importação cola conteúdo de CSVA interface lê arquivo de até 2 MB e envia seu texto à API
Congelamento e exportação são ações da tela de segmentosEndpoints existem, mas faltam controles correspondentes na interface
Push automático alcança o lead consumidordispatch.sendPush() escolhe o responsável do lead ou negócio
Vincular pedido depois do ganho por atualização comumDeal/validations.js:update() não aceita order; o vínculo é aceito no endpoint de ganho
Um estágio removido está sempre protegido se tem negócioA proteção consulta apenas negócios abertos

Essas diferenças foram incorporadas aos guias para não orientar o usuário a depender de um comportamento que ainda precisa ser implementado.

Outros pontos que merecem acompanhamento​

O botão toggle de cadência pausa/retoma inscrições; update apenas altera campos da cadência. Para automações e integrações, use o endpoint apropriado. A função de resposta prioriza filtro por lead se ambos os vínculos forem informados; inscrições apenas por negócio podem precisar de tratamento complementar.

O job de estagnação não limpa uma marca antiga de um estágio cujo SLA foi desabilitado com zero, pois varre etapas com prazo positivo. O frontend limpa a marca local após registrar interação, mas a resposta do servidor pode mantê-la até a varredura.

O modelo linear de atribuição divide só primeiro e último toque. Datas de leads e de vendas têm recortes diferentes, e múltiplas vendas do mesmo lead também podem elevar a taxa acima de 100%. A conversão entre estágios compara contagens deduplicadas de visitas, não pares de transições obrigatórias. Ganho e Perdido ficam na mesma sequência ordenada: não interprete uma divisão entre essas etapas terminais como progressão de uma para outra.

O cron RFM e o teto diário de cadências usam o fuso do processo, enquanto a agenda utiliza o aparelho. No celular de 390 px, os valores do resumo podem quebrar em duas linhas; o quadro exige rolagem horizontal. Os prints preservam essas condições reais de layout.

O guard do frontend verifica login, e a central controla atalhos por features; a proteção efetiva de dados precisa continuar na API. Tokens e perfil usam armazenamento do navegador. A presença de configuração Firebase e integrações locais deve ser avaliada pelos responsáveis pelo ambiente sem incorporar segredos à documentação.

Validação desta entrega​

Os 24 arquivos de teste e 244 testes unitários existentes dos domínios lead, deal, activity, cadence e segment passaram. O comando usado foi:

npm test -- --runInBand --testPathPattern='unit/domains/(lead|deal|activity|cadence|segment)/' --reporters=default

Também foram reproduzidas duas incompatibilidades localmente: o middleware real de criação rejeitou o payload da tela com "consent" is not allowed, e a sequência de parsers Express consumiu o JSON sem executar o verify local do webhook. Essas verificações não utilizaram rede externa nem banco.

Esses testes exercitam funções e controllers isolados. Eles não passam necessariamente pela combinação real de validação, parser, autenticação, transação e controller. Por isso, testes de domínio aprovados podem coexistir com os bloqueios de contrato identificados.

O npm run typecheck e o npm run build do pepper-docs passaram, sem links internos quebrados. A visão geral e o diagrama de arquitetura foram conferidos no navegador.

A compilação Angular das capturas usa componentes e estilos reais, com serviços substituídos por dados fictícios. Foram capturadas telas desktop e mobile e revisadas visualmente. A manutenção e os requisitos desse processo estão em Arquitetura e integrações.

Critérios propostos para homologação após correções​

  1. Cadastrar lead pela tela com e sem aceite e conferir prova de consentimento.
  2. Capturar em landing e importar CSV; repetir contato e testar duas capturas simultâneas.
  3. Converter com e sem telefone, reaproveitar cliente e abrir negócio no funil correto.
  4. Criar oportunidade com lead vinculado e testar referências de outra empresa em ambiente isolado.
  5. Mover entre etapas e funis, preservar histórico e verificar rollback diante de erro.
  6. Registrar resposta e confirmar encerramento da inscrição e crédito de variante.
  7. Ganhar/perder, garantir ausência de novos toques e conferir relatório versus pagamento.
  8. Pausar/retomar, retirar inscrição, revogar aceite e testar carrinho sem lead associado.
  9. Repetir chamadas negadas e falhas de commit, conferindo fechamento das sessões.
  10. Conferir múltiplos funis, reabertura, salto de etapas, atribuição e recálculo com mais de 500 leads.

São critérios de validação futura, não testes já executados nesta entrega. As alterações desta revisão se concentram no pepper-docs; os problemas de aplicação estão documentados para correção.