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.mdDados 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¶
- As notas existem no DW_Novo desde 202101. Em
"nfse"."vw_nfsemista_v1", comcod_cnpjtexto de 14 dígitos (zeros à esquerda preservados) edat_atuzcontemporâneo à emissão (emissão 202101 →dat_atuz2021-01-05). - A extração é incremental por
dat_atuz.E_NFSE.qvs(~L588-603) corta pordat_atuz >= max(dat_atuz do QVD mensal mais novo) − vIntervalo_Incremental (2 dias). O corte acompanha o presente (~hoje−2). - 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 comdat_atuzanterior ao corte da virada nunca foi extraído e nunca mais será — a menos que uma carga full de transição o cubra. - 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. - 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.
- Bug adicional confirmado no código —
T1_Detalhado_NFSE.qvs(~L419): oconcatenate (Notas)das nacionais não temWHERE NOT Exists(CHAVE…)(sem dedup). Com a sobreposição pós-202510, oNFSE_Detalhado_*.qvd(que alimentaAlerta_NFSEe oConsolidador) 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.qvs→NfseNacional_{periodo}.qvd(viewvw_nfsenacional_v1), consumida só porT1_Detalhado_NFSE. A cadeia da fato (T1_Nfse→T1_Nfse_Tomador_Aggr→ app NFSE final) parte deNfse_{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, colunafaltando_apos_nacional): - ~780–900 mil notas nacionais/mês (até 202509) presentes só 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_atuzfoi 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 quandodat_atuzfoi 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_Nacional→NfseNacional_*.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)¶
- 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. - Reprocessar todos os meses históricos (202101–202606) da view nova no
E_NFSEcomvModoIncremental=0(full por período, ignoradat_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). - 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_*.qvdpassar a incluir as nacionais (full da view mista) eT1_Detalhado_NFSEcontinuar somandoNfseNacional_*.qvdsem 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 comWHERE NOT Exists(CHAVE).
Atualização (2026-07-29)¶
- Backfill promovido a produção. Piloto 202101 + backfill 202102–202607 (todos com
exit scriptantes da rotina de exclusão) copiados deNfse_Testepara3.DadosExtraidos/Nfse/; tamanhos teste×produção conferem.T_NFSE/T1_Nfereconstroem sozinhos (gateFileTime). - 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}.qvdedw_notas_distintasdo 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_NFSEaplicada junto do reprocesso da fato - [ ] Melhoria estrutural do incremental registrada/aplicada