Pular para conteúdo

C-001 — NFSe: ponto cego do incremental na virada DW antigo → DW_Novo

Status: causa raiz confirmada; backfill 202101–202607 promovido a produção (2026-07-29); verificação pós-reload (ticket + app viva) pendente. Ver Atualização. Ticket de origem: NFSESumiu-01 · Período: 2026-07-28/29 · App-alvo: E_NFSE (ETL) · Workspace (repo): oficina/correcoes/nfse-ponto-cego-incremental.md

Dados reais só via MCP Guardião (por ticket_id) ou consulta manual do operador — nenhum dado sensível neste documento.

Sintoma

Contribuinte com notas emitidas de 2021 a 2024 não aparece em nenhuma app NFSE. O rastreamento por etapa (nfse_rastrear_ticket_periodos + scripts manuais) mostrou zero notas em TODAS as camadas — inclusive nos QVDs de extração (3.DadosExtraidos\Nfse\Nfse_AAAAMM.qvd), buscando por documento exato e por raiz.


1. Achados confirmados

  1. As notas existem no DW_Novo desde 202101. Em "nfse"."vw_nfsemista_v1", com cod_cnpj texto de 14 dígitos (zeros à esquerda preservados) e dat_atuz contemporâneo à emissão (emissão 202101 → dat_atuz 2021-01-05).
  2. A extração é incremental por dat_atuz. E_NFSE.qvs (~L588-603) corta por dat_atuz >= max(dat_atuz do QVD mensal mais novo) − vIntervalo_Incremental (2 dias). O corte acompanha o presente (~hoje−2).
  3. Ponto cego permanente na virada vUsarDWNovo=1. Historicamente a extração lia o DW antigo ("fazenda"."iss_notas_fiscais"). Quando passou a ler a view nova, o corte incremental já estava em data recente: todo registro que entrou na view nova com dat_atuz anterior ao corte da virada nunca foi extraído e nunca mais será — a menos que uma carga full de transição o cubra.
  4. Faltam ~1 milhão de notas/mês nos QVDs históricos (comparativo v3, 2026-07-29), consistente em todos os meses (202509 → 1,21M; 202601 → 1,16M; 202606 → 1,07M). A view tem 1 linha por nota (duplicação de versão = 0), então a diferença é dado ausente de verdade. Ordem de grandeza: 60–70 milhões de notas represadas em ~66 meses.
  5. O mês corrente (202607) bate exato — único mês construído inteiramente da view nova pelo incremental diário. Confirma que o mecanismo atual é íntegro; o buraco é histórico.
  6. Bug adicional confirmado no códigoT1_Detalhado_NFSE.qvs (~L419): o concatenate (Notas) das nacionais não tem WHERE NOT Exists(CHAVE…) (sem dedup). Com a sobreposição pós-202510, o NFSE_Detalhado_*.qvd (que alimenta Alerta_NFSE e o Consolidador) tende a contar nota em dobro desde ~novembro/2025.

2. Hipóteses em aberto

  • Split-brain entre as duas cadeias. Existe extração paralela E_NFSE_Nacional.qvsNfseNacional_{periodo}.qvd (view vw_nfsenacional_v1), consumida por T1_Detalhado_NFSE. A cadeia da fato (T1_NfseT1_Nfse_Tomador_Aggr → app NFSE final) parte de Nfse_{periodo}.qvd. Hipótese: o ~1M/mês "faltando" na fato = notas nacionais já extraídas no arquivo paralelo → o dado não está perdido, mas a app NFSE final nunca vê nota nacional.
  • Decomposição do ~1M/mês (comparativo v4, coluna faltando_apos_nacional):
  • ~780–900 mil notas nacionais/mês (até 202509) presentes em NfseNacional_*.qvd — fora da cadeia da fato, não perdidas;
  • resíduo de ~300–590 mil notas/mês ausentes de TODOS os QVDs (grupo do ticket NFSESumiu-01, Nota Legal/POA) — causa a caracterizar (provável: o DW antigo nunca teve essas notas);
  • a partir de 202510/202511 as duas extrações passam a se sobrepor quase 100% (migração de POA para o emissor nacional).
  • Ressalva do operador (2026-07-29). O contribuinte do ticket emite notas de POA (não Nota Nacional) e o operador acredita ter feito uma carga total quando o campo dat_atuz foi criado. Se confirmado, o ponto cego segue válido como risco estrutural, mas a exclusão deste contribuinte pode ter outra causa (carga full incompleta, filtro na view/WHERE, ou notas ausentes do DW antigo à época).
  • Pendências de confirmação: data exata da virada vUsarDWNovo=1; escopo/fonte da carga total feita quando dat_atuz foi criado.

Tabela de hipóteses

Hipótese Situação Evidência
Notas nunca existiram (erro de cadastro) Descartada Existem em vw_nfsemista_v1 desde 202101; app estática de 22/jun mostra o contribuinte
Ponto cego incremental na virada DW → DW_Novo Confirmada Corte por dat_atuz recente na virada; ~1M notas/mês represadas nos QVDs históricos
Split-brain fato vs Detalhado (nacional só no arquivo paralelo) Sustentada E_NFSE_NacionalNfseNacional_*.qvd consumido só por T1_Detalhado; a fato parte de Nfse_*.qvd
Dupla contagem no Detalhado (concatenate sem dedup) Confirmada no código T1_Detalhado_NFSE.qvs ~L419 sem WHERE NOT Exists(CHAVE)
Anomalia 202604-202607 = bug de script na extração Descartada Re-run fechou o gap; não reproduziu como bug
Anomalia 202604-202607 = timing do ciclo diário do DW Confirmada Gap caiu de milhões para <0,1% após re-run com o DW estabilizado

3. Soluções (backfill aplicado; correção de dedup pendente)

  1. Quantificar o ponto cego antes de reprocessar%LOCALAPPDATA%\QlikGuardiao\exports\comparativo_dw_qvd_NFSE.qvs: por mês de emissão, DW_Novo vs. QVD extraído. Diferença = volume represado.
  2. Reprocessar todos os meses históricos (202101–202606) da view nova no E_NFSE com vModoIncremental=0 (full por período, ignora dat_atuz). ~4–5M notas/mês na fonte → rodar em lotes (ex.: por ano) em janela de manutenção; depois rodar a cadeia downstream dos meses afetados (conferir consumidores exatos em narrativa de lineage antes de disparar).
  3. Melhoria estrutural — ao trocar fonte/view do incremental, exigir um full-load de transição; opcionalmente gravar no log a fonte usada (vFrom_NFSE) por execução.

⚠️ Risco de dupla contagem (as duas cadeias andam juntas). Se Nfse_*.qvd passar a incluir as nacionais (full da view mista) e T1_Detalhado_NFSE continuar somando NfseNacional_*.qvd sem dedup (bug do achado 6), o Detalhado passa a contar em dobro. A correção tem que tratar fato E Detalhado em conjunto: incluir na fato e deduplicar/retirar do Detalhado, ou manter a separação e concatenar a nacional na cadeia da fato com WHERE NOT Exists(CHAVE).

Atualização (2026-07-29)

  • Backfill promovido a produção. Piloto 202101 + backfill 202102–202607 (todos com exit script antes da rotina de exclusão) copiados de Nfse_Teste para 3.DadosExtraidos/Nfse/; tamanhos teste×produção conferem. T_NFSE/T1_Nfe reconstroem sozinhos (gate FileTime).
  • Evidência independente da causa raiz. A app congelada "PGDAS x NFSE (cópia temporária)" (dados de 22/jun) mostra o contribuinte; a app viva "PGDAS x NFSE" (29/jul) não — confirma, fora da cadeia do DW, que as notas são reais e a cadeia viva as perdeu.
  • Anomalia 202604-202607 resolvida. O comparativo pós-promoção mostrava gap de milhões nesses 4 meses; o re-run full fechou para <0,1% (dezenas/poucos milhares). Causa: timing do ciclo diário do DW (janelas de atualização full/incremental ~21:40–22:45) — o backfill anterior pegou snapshot parcial; o re-run pegou o DW estabilizado. Não é bug de script.
  • Ainda aberto: correção do dedup em T1_Detalhado_NFSE (achado 6) e a melhoria estrutural do incremental (full-load de transição obrigatório).

4. Cronologia (reconstruída dos commits — bodies vazios)

Marco Commit O que fechou
Início e90d04d Tools NFSE de rastreamento e exclusão por chave (viabilizam a investigação)
Causa raiz 09d36ef Ponto cego incremental na virada DW antigo → DW_Novo
Quantificação 0f6e27f ~1M notas/mês ausentes dos QVDs; mês corrente íntegro
Cadeia paralela 50f7600 Hipótese split-brain (fato vs Detalhado) e risco de dupla contagem
v4 quantificado 6037a6b Resíduo 300–590k/mês fora de todos os QVDs; dupla contagem sem dedup no Detalhado desde ~202511
Diagnóstico 5a2b031 Framework nfse_diagnostico com allowlist e consulta "ping" de fumaça

5. Verificação (após o reprocesso)

  • Reexecutar nfse_rastrear_ticket_periodos (ticket NFSESumiu-01): contagens > 0 nas 4 etapas nos meses com notas no DW.
  • Comparativo DW vs QVD zerado (ou justificado) em todos os meses.
  • Conferir downstream (T1/T2/apps finais) via lineage após reload da cadeia.
  • Confirmar razão ~1x (não 2x) entre NFSE_Detalhado_{periodo}.qvd e dw_notas_distintas do mês (valida a correção do bug de dedup).

Checklist de reprocesso

  • [x] Ponto cego quantificado (comparativo DW vs QVD) — via tool + manual
  • [x] Janela de reprocesso definida — runbook no workspace
  • [x] Reprocesso executado em teste + promovido a produção (202101–202607)
  • [x] Anomalia 202604-202607 resolvida — timing do ciclo diário do DW, não bug
  • [ ] Verificação pós-reload (ticket NFSESumiu-01 + comparativo + app viva "PGDAS x NFSE")
  • [ ] Correção do dedup em T1_Detalhado_NFSE aplicada junto do reprocesso da fato
  • [ ] Melhoria estrutural do incremental registrada/aplicada