Skip to content

feat(auditoria): script CRM→ERP + relatório (R$ 10,5M de vazamento)#113

Open
Warleypablo wants to merge 18 commits intomainfrom
feature/auditoria-crm-erp
Open

feat(auditoria): script CRM→ERP + relatório (R$ 10,5M de vazamento)#113
Warleypablo wants to merge 18 commits intomainfrom
feature/auditoria-crm-erp

Conversation

@Warleypablo
Copy link
Copy Markdown
Owner

🎯 TL;DR

Script one-shot que audita o funil Bitrix → ClickUp → Conta Azul em 23 categorias e gera um relatório Markdown + 23 CSVs versionados em docs/auditoria/. A primeira execução em produção encontrou R$ 10.495.223,52 de vazamento financeiro estimado nos últimos 12 meses (worst case).

Documentos de referência:

🔥 Top 5 vazamentos identificados

# Categoria Casos R$ Impacto
1 Deals ganhos sem CNPJ no Bitrix 407 R$ 7.149.365
2 MRR contratado ≠ MRR cobrado 42 R$ 821.517
3 Valor pontual no Bitrix sem parcela no CAZ 80 R$ 790.152
4 Contratos encerrados com parcelas abertas (risco jurídico) 203 R$ 630.167
5 Inadimplência pós-churn > 90 dias 161 R$ 409.374

O #1 sozinho explica 68% do vazamento — 407 deals em "Negócio Ganho" no Bitrix sem CNPJ preenchido, impossibilitando o JOIN com o ERP.

📦 O que tem na diff

Código novo (scripts/auditoria/):

  • auditoria-crm-erp.ts — runner principal (orquestra catalog + queries + render)
  • lib/normalize-cnpj.ts, validate-cnpj.ts (módulo 11), format-currency.ts (BRL)
  • lib/run-query.ts — wrapper de execução com timing + erro graceful
  • lib/render-csv.ts — exporta CSV via csv-stringify/sync
  • lib/render-markdown.ts — gera o relatório completo com headline, top 5, seções, ações ROI, anexo
  • catalog.ts — metadados das 23 categorias
  • queries/01..23-*.sql — 23 SQLs validadas em prod
  • lib/__tests__/*.test.ts — 14 testes unitários (helpers)
  • DISCOVERY.md — gotchas de schema descobertos durante o plan-writing

Artefatos (committed):

  • docs/auditoria/2026-04-15-auditoria-crm-erp.md — relatório principal (42KB)
  • docs/auditoria/2026-04-15/csv/*.csv — 23 CSVs (3.838 linhas)

Modificações:

  • package.json — adiciona script `auditoria-crm-erp` + dep `csv-stringify@^6.7.0`

▶️ Como rodar

```bash
AUDITORIA_DATABASE_URL='postgresql://postgres:...@34.95.249.110:5432/dados_turbo' \
npm run auditoria-crm-erp
```

  • Tempo total: ~3,5s contra prod
  • Multi-empresa: Turbo Partners + PEIXOTO DEBBANE unificadas
  • Janela: 12 meses + snapshot atual
  • Idempotente: roda quantas vezes quiser; sobrescreve artefatos do dia
  • Dry-run: `--dry-run` roda só as 3 primeiras queries pra validar setup

`AUDITORIA_DATABASE_URL` é necessário porque o `DATABASE_URL` padrão do projeto aponta pro banco local de dev.

🩺 Achados estruturais (sub-tasks de remediação sugeridas, fora deste PR)

  1. CNPJ no Bitrix é o nó do problema — apenas 7,4% dos deals do CRM têm CNPJ. Tornar obrigatório no stage "Negócio Ganho".
  2. `crm_deal.stage_semantic` 0,21% — bug ETL, deveria estar populado com S/F/P. Investigar pipeline de ingest do Bitrix.
  3. `caz_parcelas.tipo_fatura` 100% NULL — coluna existe mas nunca foi populada.
  4. 154 grupos de duplicatas no CAZ vs 17 no ClickUp — cadastro do CAZ é 9× mais bagunçado.
  5. 1011 "CNPJs malformados" — em sua maioria são CPFs em campo CNPJ. Erro de cadastro sistêmico.
  6. 322 clientes ativos no ClickUp sem deal correspondente no Bitrix — comissionamento órfão de origem desconhecida.
  7. DATABASE.md está desatualizado — falta documentar colunas reais de `crm_deal` (`cnpj`, `valor_recorrente`, `valor_pontual`, `closer`, `sdr`, etc.).

⚠️ Caveats e limitações (também documentadas no anexo do relatório)

  • Estimativas são teto worst case, não previsão. Cada caso precisa ser validado individualmente antes de virar planilha de cobrança.
  • Cat 12 tem 1 row de noise: o CNPJ da própria Turbo Partners aparece 6× porque está em ambas as empresas do CAZ. Filtrar manualmente do top.
  • Cat 16 (nomes divergentes) tem alta taxa de falso positivo — abreviações vs nomes legais.
  • Cat 08 (reajustes não refletidos) marcada como exploratória — pode vir com falsos positivos altos. Retornou 0 nesta execução.
  • Pipelines do Bitrix além de 0 e 12 ficaram fora por escopo.
  • Auditoria de despesas (`tipo_evento='DESPESA'`) está fora — escopo é receita.

✅ Test plan

  • Helpers TS: `npx vitest run scripts/auditoria/lib/tests/` → 14/14 passando
  • Smoke test dry-run: `npm run auditoria-crm-erp -- --dry-run` → 3 queries executam, exit 0
  • Execução completa em prod: 23/23 queries executam sem erro, 3,5s wall time
  • Sanity check manual: validados casos individuais das categorias 01, 05, 12 (top rows fazem sentido)
  • Sem regressão: PR só adiciona arquivos novos sob `scripts/auditoria/` e `docs/auditoria/`, modifica apenas `package.json` (adiciona 1 script + 1 dep)
  • Validação humana de 3 casos das categorias com maior impacto antes de pautar como ação:
    • Cat 01: abrir 5 dos 407 deals sem CNPJ no Bitrix e confirmar
    • Cat 05: abrir 3 dos 457 contratos cup ativos sem recorrente e confirmar via Conta Azul
    • Cat 09: confirmar 3 dos 203 casos de "cobrando após encerramento" (risco jurídico)

🤖 Generated with Claude Code

Warleypablo and others added 18 commits April 14, 2026 19:48
…rias

Spec one-shot script gerando relatório Markdown + CSVs anexos.
Cobre vazamento de caixa, sub-cobrança, pós-churn, higiene, status
divergente, cross-CRM e cobertura. Janela 12 meses, multi-empresa
unificada (Turbo Partners + PEIXOTO DEBBANE).

Achados pré-spec: 539/611 deals "ganhos" sem CNPJ no Bitrix; pipeline
"Pós-Ganho/Subir-Ajustar Cobrança" com 0% CNPJ; stage_semantic vazio
em ~99,9% dos deals (bug ETL).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Plano TDD bite-sized para o spec aprovado em 2026-04-14. Cobre:
- Task 1: DISCOVERY.md com schema gotchas
- Task 2: helpers (CNPJ normalize, validate módulo 11, format BRL) + tests
- Task 3: runner skeleton + catalog + dry-run
- Tasks 4-10: 23 queries SQL distribuídas em 7 seções
- Task 11: renderer markdown completo
- Task 12: execução final + sanity check

SQL pré-validado contra prod read-only durante plan-writing
(tipo_evento='RECEITA' uppercase, tipo_fatura 100% NULL, status
buckets ClickUp lowercase).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…rmat BRL

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ódulo 11

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
…, mensagem pg_trgm

- Pool.end() movido para bloco finally (evita pool leak em crash path)
- DATABASE_URL ausente agora exibe os dois caminhos tentados antes de exit(1)
- writeCsv só executa quando result.error é falso (sem CSVs vazios em erro)
- Mensagem pg_trgm esclarece que similarity() é o motivo (queries 02 e 16)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nsion

- DATABASE_URL no .env aponta pro local (cortex_dev); auditoria precisa
  rodar contra prod. Novo env var AUDITORIA_DATABASE_URL tem precedência.
- ssl auto-desliga quando a URL é localhost.
- Verificar pg_trgm via pg_extension em vez de tentar CREATE EXTENSION
  (que exige superuser e estava emitindo falso alarme — extension já
  está instalada no prod).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implementa as 5 queries da Seção A (vazamento de caixa) para o audit runner.
Fix: cast explícito ids::uuid nas queries 03 e 05 para resolver mismatch
de tipos varchar/uuid no join com caz_parcelas.id_cliente.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona queries 06 (MRR contratado vs cobrado), 07 (valor pontual sem
parcela no CAZ) e 08 (reajustes não refletidos, exploratório). Inclui
cast ::uuid em caz_clientes.ids para corrigir type mismatch com
caz_parcelas.id_cliente (uuid). Validadas em prod: 42, 80 e 0 linhas.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona queries 09 (contratos encerrados com parcelas abertas) e 10
(inadimplência pós-churn > 90 dias). Inclui cast ::uuid em
caz_clientes.ids para corrigir type mismatch. Validadas em prod:
1175 e 274 linhas.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…p por cliente

- Query 09: substitui filtro 'PAGO'/'CANCELADO' (inexistentes no DB) por
  status IN ('PENDENTE', 'ATRASADO'), que são os valores reais de parcelas abertas
- Queries 09 e 10: cup_closed agregado por cliente (GROUP BY + MAX encerramento)
  elimina duplicação N×parcela quando cliente tem múltiplos contratos encerrados
- Resultado: Q09 203 rows (era ~1175), Q10 159 rows (era ~274), sem duplicatas

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Queries 11-16 cobrem higiene de cadastro: duplicatas de CNPJ em ClickUp
e Conta Azul, clientes sem CNPJ, CNPJs malformados (comprimento/dígitos)
e nomes divergentes entre sistemas via pg_trgm similarity.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Queries 17-18 detectam clientes inativos no ClickUp com parcelas pagas
pós-inativação (>30 dias) e clientes ativos sem parcela de receita nos
últimos 6 meses — ambas com cast ::uuid para join caz_clientes.ids → caz_parcelas.id_cliente.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Queries 19 e 20: deals perdidos no Bitrix com cliente ativo no ClickUp,
e clientes ativos no ClickUp sem deal correspondente no Bitrix.
Query 20 usa DISTINCT ON para deduplicar CNPJs com múltiplas tasks.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Queries 21-23: % CNPJ preenchido por pipeline, % stage_semantic preenchido
por pipeline (confirma bug ETL: <0.3% de cobertura), e top campos críticos
vazios por sistema (empresa 100% vazio, stage_semantic 99.9%, CNPJ Bitrix 92.6%).

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
… ações ROI, anexo)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resultado da execução de 14/04/2026 contra prod (Turbo Partners +
PEIXOTO DEBBANE unificadas). Janela de 12 meses. Todas as 23
categorias rodaram sem erro.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Base automatically changed from staging to main April 28, 2026 20:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant