Repository navigation
audit(danfse): mapear conformidade de todos os blocos à NT 008 #119
Description
Objetivo
Realizar a auditoria de conformidade do DANFSe v2 completo diante da Nota Técnica SE/CGNFS-e nº 008/2026, versão 1.02, e de seu Anexo I, para orientar as correções efetivamente necessárias na iniciativa #118.
Entrega desta issue: uma matriz normativa reproduzível, com evidência do comportamento do renderizador atual, testes existentes/ausentes e proposta de agrupamento de correções. Não é uma autorização para refatorar o renderizador inteiro em um único PR.
Abrangência
Percorrer, sem exceções, os blocos e as regras dos itens 2.1 a 2.5:
- Cabeçalho, identificação da NFS-e/DPS, QR Code e ambiente.
- Prestador, tomador, destinatário e intermediário (inclusive ausentes, coincidentes e estrangeiros).
- Serviço prestado, Código IBGE/CEP, município/UF, NBS e descrições.
- ISSQN, tributos federais, IBS/CBS, totalizadores e informações complementares.
- Canhoto opcional, documentos cancelados/substituídos e produção restrita.
- Disposição das células, tipografia, margens, divisórias, sombreamento, condições de supressão, limites de texto e impressão em uma única página.
Matriz de avaliação
Para cada requisito normativo, registrar:
- Seção, tabela ou nota da NT 008 e campo/bloco do Anexo I.
- Natureza da regra: obrigatória, sugerida ou condicional, sem transformar dimensões sugeridas do item 2.4.5 em obrigações.
- Fonte no XML autorizado ou fonte externa de estado explicitamente requerida e justificada.
- Comportamento atual (referência ao código/HTML/CSS e, quando necessário, PDF sintético).
- Estado: conforme, divergente, não aplicável ou dependente de esclarecimento.
- Teste de regressão existente ou necessário e proposta de correção.
- Consequências para consumidores apenas quando houver mudança observável de contrato.
Registrar a matriz em comentário da própria issue e/ou na discussão de um PR de auditoria. Não criar nem versionar um arquivo .md de diagnóstico, plano de execução, histórico de PRs ou estados transitórios no repositório.
Pontos de partida já verificados
src/Danfse/HTMLTemplate.php: reexaminar a ordem das células de nome, e-mail, município/UF, endereço e Código IBGE/CEP nos blocos de participantes frente ao Anexo I; o campo do intermediário apresenta apenas CEP.- O CSS utiliza
0.7ptpara determinadas divisórias e borda externa; o item 2.2.3 especifica 0,5 pt para divisórias entre blocos e 1 pt para a borda da página. - A NT 008, item 2.2, exige uma única página; a documentação atual em
docs/danfse-v2-rendering.mdafirma que textos longos podem continuar em páginas posteriores. Classificar como divergência entre garantia documentada e norma e indicar a correção do contrato estável, sem acrescentar diário de desenvolvimento à documentação. tests/Unit/Danfse/DanfseGoldenReferenceTest.phpetests/Unit/Danfse/DanfseTemplateTest.phpverificam conteúdo e estilos selecionados; avaliar cobertura faltante de posição/ordem das células, regras condicionais, número de páginas e layout efetivamente renderizado.- Conferir com o XML e a NT 008 as condições para destinatário, tributos municipais opcionais, campos efetivos/apurados de IBS/CBS, informações complementares, marca d'água de cancelamento e substituição. Tratar essas áreas como itens a auditar, não como defeitos já demonstrados em todos os cenários.
Como verificar
- Usar somente XMLs e dados sintéticos, incluindo variações de campos opcionais, participantes distintos/coincidentes, endereços nacionais/estrangeiros, tributações com/sem IBS/CBS, descrições extensas e documentos com estados fiscais diferentes.
- Inspecionar os dados de
DanfseTemplate::buildData(), a estrutura deHTMLTemplate.php, o PDF resultante e a documentação normativa. - Considerar também
DanfseGenerator::generateFromXml()e os testes de referência existentes. - Identificar os testes que devem falhar com o comportamento incorreto (por exemplo, ordem das células, paginação ou espessuras), além de casos negativos.
- Para problemas visuais, usar evidência gerada com fixtures sintéticas; não exigir igualdade byte a byte de PDFs nem screenshots com dados de contribuintes reais.
- Não enviar/reemitir DPS nem depender de ambientes fiscais para demonstrar a apresentação do PDF.
Critérios de conclusão
- Existe uma matriz com rastreabilidade de todos os blocos e requisitos aplicáveis da NT 008, sem lacunas não classificadas.
- A distinção entre exigência obrigatória, condição, sugestão de dimensão e campo não aplicável foi revisada.
- As divergências têm evidência técnica e teste reproduzível proposto; resultados inconclusivos estão claramente marcados.
- A matriz identifica o tratamento de página única, bordas e divisórias, Código IBGE/CEP, participantes e campos fiscais condicionais.
- Os trabalhos já existentes (Validate DANFSe v2 rendering against official NT 008 reference cases #57, fix(danfse): adequar identificação do município e UF no cabeçalho à NT 008 #117 e PRs relacionados) foram considerados, sem duplicação de correções.
- As divergências estão agrupadas em entregas independentes passíveis de PR e com critérios de aceitação propostos; novas issues são criadas somente após revisão dessa decomposição.
- Nenhum arquivo de documentação versionado foi criado ou alterado apenas para registrar a auditoria, seus estágios ou suas pendências.
- Nenhum dado fiscal real, identificador de contribuinte ou documento de terceiros foi publicado.
Referências
- Iniciativa de conformidade: epic(danfse): concluir apresentação NT008 v1.02 com divergência tipográfica documentada #118 (referência contextual; o vínculo nativo de sub-issue ainda não foi configurado).
- Validate DANFSe v2 rendering against official NT 008 reference cases #57 — testes de referência já implementados.
- fix(danfse): adequar identificação do município e UF no cabeçalho à NT 008 #117 — correção específica do cabeçalho, independente desta auditoria.
- NT 008/2026 v1.02 — Especificações Técnicas do DANFSe.
Fora de escopo
- Alterar dados fiscais, XML, DPS, cálculos tributários ou protocolos de transmissão.
- Realizar refatoração integral do renderizador nesta issue.
- Criar documentação de estados transitórios ou arquivos de acompanhamento no repositório.
- Publicar exemplos reais de empresas, municípios, clientes ou notas fiscais.
Complemento da auditoria de outubro/2026
Incluir na matriz por bloco: (i) caminho exato no XML autorizado, (ii) valor ausente versus zero versus código válido, (iii) origem de cada rótulo/total, (iv) suporte comprovado à versão XSD/ambiente, (v) mutação que faria teste falhar, (vi) custo aproximado da classe de teste. Conferir NT007 (vRetCSLL = conjunto de contribuições retidas conforme tpRetPisCofins) e campos IBS/CBS da NT009 somente para formatos realmente implementados. A equivalência de nomenclatura PHP↔campo XML não prova igualdade de natureza tributária. Testar modelo de dados, DOM/HTML e PDF final separadamente. Matriz e achados continuam na issue/PR, nunca em relatório transitório versionado.
Activity
vitormattos commentedon Oct 12, 2026
Matriz normativa NT 008 v1.02 / Anexo I — revisão inicial do
main(12/10/2026)Fonte primária identificada: versão oficial 1.02 de 14/07/2026, listada em https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc ; PDF oficial https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf ; cópia integral consultável hospedada pela FENACON https://fenacon.org.br/wp-content/uploads/2026/07/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf . Comparar também a representação gráfica do Anexo I, não apenas a tabela 2.4.5.
main=60c4fad793c6562820e36085eeb8dab2c0f68b1f; #57 e PR #113 já entregues; PR #116 aberto (retenções NT007, país e testes). Sem operações fiscais.Legenda: O = obrigatório; C = condicional; S = sugestão (dimensões/quantidade de caracteres 2.4.5); P = parcial; D = divergente; N = não demonstrado.
-é representação de ausência, não substituto do zero expresso no XML. Testes ausentes são recomendações, não falsos checks verdes.sumCurrency()refaz total IBS/CBS, exclusões e retenções federais noDanfseTemplate; descontos emtribMunem vez dos caminhos devDescCondIncond; potencial criação de valores não autorizadosbuildData()→ HTML → PDF, três cenários ausente/0/valor, sem somar por inferênciainfNFSe/@Id), DPS número/série/datas,tpEmit,cStat,finNFSe, QRstatusLabelmapeia somente 100infNFSe/xLocEmi+emit/enderNac/UF; suprimir município se itemcTribNac= 99; município 8pt, ambiente 6ptinfDPS/prest, inclusive endereço, município, IBGE/CEP; linha NomeinfDPS/toma, identificação completa ou mensagem de ausênciainfDPS/IBSCBS/dest, distinto/coincidente com tomador; mensagens normativaselsedo intermediárioinfDPS/intermcom município e IBGE/CEP; mensagem específica se ausenteserv/cServ/{cTribNac,cTribMun,cNBS,xDescServ},xTribMunprefere axTribNacquando informado; localidaderegEspTrib,tpImunidade,exigSusp/{tpSusp,nProcesso}, benefício, deduções/descontos, BC/alíquota/apuradovRetCSLLsendo revista por PR #116; não sobrepor nem inferir CSLL isoladatpRetPisCofinsconforme NT007, coordenar com PR #116infDPS/IBSCBSclassificação/indicador;infNFSe/IBSCBSvalores autorizados: reduções, bases, alíquotas normais/efetivas, apurações municipal/UF/CBS-; ausentes alíquotas efetivas e montantes UF/MUN; campo exclusões soma tributos sem base normativa completainfNFSe/valores/vTotalRet,vLiq,infNFSe/IBSCBS/totCIBS,vTotNF; descontos do DPSvTotalRet; combina duas grandezas em uma célula e repete valor total em IBSxInfComp+ percentuais sintéticos-sempre, sem outros campos; fontes aproximadas são responsabilidade do emissor (akaunting-nfse#425)Dompdfsem guard de páginas; CI visual exigepages > 1pdfinfo, extrair texto/coordenadas; casos extremos devem falhar explicitamente se impossíveis sem ocultar informaçãocStatousubstisoladosAchado especialmente crítico:
.github/workflows/danfse-visual.ymlcontémtest "$pages" -gt 1para a fixture longa. Esse contrato atual conflita com o item 2.2. O teste de normalidade deve exigir exatamente uma página; conteúdo irredutível deve resultar em falha explícita de geração, não truncamento silencioso ou segunda página. Um limite de texto é sugerido na tabela 2.4.5, não permissão genérica para descartar dados fiscais obrigatórios.Decomposição para revisão (sem duplicar o encerrado): #117 cabeçalho; #120 linhas condicionais ISS; entrega própria de participantes e destinatário; entrega própria de fidelidade fiscal/IBS/CBS (coordenada com PR #116); entrega própria de PDF/paginação/CI; matriz/evidências e fechamento integrado em #118. Não declarar esta matriz como prova de PDF: evidências precisam ser anexadas em PR, com teste de renderização real.
Fronteiras: #57/PR #113 integrados; PR #116 ainda não integrado; akaunting-nfse#424 decide elegibilidade de regime e #425 origem dos tributos aproximados antes da DPS; este repositório apenas apresenta o que o XML autorizado contém. NT009 preview não é fonte para inventar DANFSe autorizado. Nenhum dado ou certificado real utilizado.
vitormattos commentedon Oct 12, 2026
Complemento corretivo à matriz inicial — após leitura integral da NT008 oficial e inspeção de PDFs sintéticos (12/10/2026)
...) quando o campo não comportar integralmente o texto; o quadro 2.4.5 sugere, por exemplo, 1300 caracteres para descrição do serviço e 2000 para complementares. Preservar íntegro o XML autorizado; apresentar abreviação identificável no PDF, sem suprimir campos obrigatórios, observando os tamanhos mínimos de fonte e a ordem fixa dos tributos aproximados.infNFSe/valores/vTotalRetpara o total de retenções.11750842108e fix(danfse): distinguir ausência e zero em linhas municipais condicionais (#120) #12311750328988, ambos com PDF de referência = 1 página e PDF longo = 3 páginas, conformepdfinfo. O workflow atual exigepages > 1no caso longo, contradizendo NT008 2.2.pdffontsem PDF de referência mostra Helvetica / Helvetica-Bold, não as famílias nomeadas na NT008 2.4.tpImunidade=0com sentido próprio, embora NT008 2.4.5 descreva 1–5; deve ser registrado como divergência a conciliar com versão/competência, sem equiparar 0 a ausência.#120(ausente, 0, 9, benefícios e não incidência), apenas o exemplo de regime 6. A evidência final deve incluir renderização por caso e inspeção manual/automatizada de células e tipografia.Fonte oficial conferida: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf (itens 2.1, 2.2, 2.4.5, notas 4/5/6, Anexo I). Este complemento corrige qualquer leitura excessivamente absoluta da matriz anterior e permanece somente na issue, não em documentação versionada de andamento.
vitormattos commentedon Oct 12, 2026
Matriz final — auditoria NT008 v1.02 e Anexo I (12/10/2026)
A matriz inicial e o complemento corretivo anteriores permanecem como histórico. Esta atualização classifica o resultado APÓS merge do PR #136 (11fa63d). Fonte oficial: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf. Legenda: A = implementado/testado, D = divergência comprovada, NA = contrato futuro não suportado.
Evidência: PR #136, cinco commits assinados/DCO, merge verificado 11fa63d e 10/10 verificações de CI. Artifact GitHub Actions 11759872398, run 38277928235: 9 PDFs sintéticos; pdfinfo: 9/9 A4 de uma página; pdffonts: PDF padrão Helvetica, prova local DejaVuSans com emb=yes; inspeção de texto e imagens renderizadas. Sem emissão de nota, alteração de XML, histórico ou uso de dados/certificados reais.
Resultado: auditoria e classificação concluídas; a divergência de fonte permanece rastreada no épico #118. Este fechamento NÃO certifica conformidade integral nem encerra o épico.