Repository navigation
epic(danfse): concluir apresentação NT008 v1.02 com divergência tipográfica documentada #118
Description
Objetivo
Auditar, corrigir e comprovar a conformidade integral do DANFSe v2 produzido por nfse-php com a Nota Técnica SE/CGNFS-e nº 008/2026, versão 1.02, especialmente os itens 2.1 a 2.5 e o Anexo I.
O resultado deve ser verificável em todo o documento, não apenas nos campos previamente identificados com problemas (Código IBGE/CEP, alinhamentos e divisórias).
Fundamentação e evidências técnicas
A NT 008 estabelece que:
- O conteúdo impresso deve representar o XML autorizado; não se devem inventar valores fiscais ausentes (2.1).
- O posicionamento relativo dos campos deve respeitar o modelo do Anexo I; as dimensões e quantidades de caracteres sugeridas no item 2.4.5 não são obrigatórias, mas os tamanhos mínimos de fonte e as regras de apresentação são (2.1 e 2.2.4).
- O DANFSe deve ser impresso em uma única página, no mínimo A4 em orientação retrato (2.2).
- As divisórias entre blocos têm 0,5 pt, a borda da página 1 pt, e o sombreamento deve obedecer às regras específicas (2.2.3).
- Blocos e campos condicionais têm regras próprias de supressão (2.3); cancelamento e substituição requerem apresentação específica (2.5).
O código atual merece revisão integrada:
src/Danfse/HTMLTemplate.phpdispõe nome/e-mail na mesma linha, mas município/UF e Código IBGE/CEP junto do endereço, divergindo da distribuição apresentada no Anexo I.- O mesmo template utiliza, entre outros,
border-bottom: 0.7ptnas seções eborder: 0.7ptna borda externa. - O bloco do intermediário apresenta apenas CEP onde a norma também prevê identificação municipal, conforme os dados aplicáveis.
- Ainda é preciso confrontar os campos condicionais de destinatário, ISSQN, IBS/CBS, informações complementares e marcas de estado com seus respectivos contratos.
docs/danfse-v2-rendering.mdafirma que descrições extensas podem continuar em páginas adicionais; isso contradiz a exigência normativa de impressão em uma única página.- Os testes em
tests/Unit/Danfse/DanfseTemplateTest.phpetests/Unit/Danfse/DanfseGoldenReferenceTest.phpverificam diversos rótulos e conteúdos, mas não constituem uma prova de conformidade da distribuição de todas as células, da paginação e dos estilos.
As evidências acima não demonstram que cada campo esteja errado; o objetivo é mapear e corrigir somente divergências verificadas, preservando o que já funciona.
Escopo da verificação
Abranger todos os blocos previstos na NT 008:
- Cabeçalho, logomarca, município/UF, ambiente e advertência de produção restrita.
- Identificação da NFS-e e DPS: chave, QR Code, número, série, competência, emissão, situação e finalidade.
- Prestador/fornecedor.
- Tomador/adquirente.
- Destinatário da operação, inclusive quando coincidir com o tomador.
- Intermediário da operação.
- Serviço prestado: classificações, NBS, localidade e descrição.
- Tributação municipal (ISSQN), benefícios e campos condicionais.
- Tributação federal, retenções e regras aplicáveis à competência.
- IBS/CBS: classificação, localização de incidência, bases, reduções, alíquotas nominais/efetivas e valores apurados conforme o XML.
- Valores totais da NFS-e e IBS/CBS.
- Informações complementares, inclusive os totais aproximados e a ordem/separação exigida.
- Canhoto opcional.
- Estados de cancelamento, substituição e produção restrita.
Validar, por bloco, conteúdo, origem no XML, obrigatoriedade, condições de exibição, estrutura das linhas/colunas, tipografia, sombreamento, bordas e tratamento de textos extensos.
Estratégia de execução
1. Auditoria completa e rastreável. Elaborar uma matriz dos requisitos da NT 008 com: seção normativa, obrigação ou sugestão, fonte XML, comportamento observado, estado de conformidade, teste existente/ausente e correção proposta. Manter a matriz no acompanhamento da issue e/ou na discussão do PR, como evidência de revisão; não criar arquivo Markdown no repositório para relatar etapas, achados transitórios ou evolução das issues.
2. Correções independentes. Depois de validar a matriz, decompor somente os resultados que tenham entregas técnicas próprias e testáveis. Corrigir DanfseTemplate.php, HTMLTemplate.php e componentes relacionados sem refazer correções já integradas. Evitar um único PR excessivamente amplo ou uma lista especulativa de tarefas.
3. Verificação integrada. Gerar HTML e PDFs a partir de XMLs inteiramente sintéticos; comparar a distribuição com o Anexo I, confirmar uma única página e inspecionar visualmente os casos extremos de comprimento/condicionalidade. Não exigir PDFs byte a byte idênticos.
4. Revisão de consumidores. Comunicar alterações efetivas de contratos de renderização e necessidades de atualização das aplicações consumidoras, sem introduzir dependência com ERP específico.
Critérios de aceitação
- Existe uma matriz de conformidade revisada para todos os blocos da NT 008, registrada na issue ou revisão do PR, não em documentação versionada de andamento.
- Todos os desvios normativos conhecidos foram corrigidos ou receberam decisão fundamentada e testável.
- As células, linhas, campos condicionais e supressões obedecem ao Anexo I e às regras aplicáveis.
- Bordas, divisórias, sombreamentos, fontes e dimensões mínimas são validados.
- O DANFSe é gerado em uma única página na configuração suportada, sem ocultar silenciosamente informações obrigatórias.
- O Código IBGE/CEP e demais identificações são obtidos e apresentados a partir de dados autorizados, sem perda de zeros nem preenchimento fictício.
- Campos de ISSQN, tributos federais, IBS/CBS e totais são fiéis ao XML, sem recálculo no renderizador.
- Estados de cancelamento/substituição e avisos de produção restrita são testados com uma fonte de estado explícita e confiável.
- Testes de estrutura HTML, unidade, geração de PDF e inspeção visual sintética cobrem os casos obrigatórios, opcionais, estrangeiros, incompletos e extensos.
-
composer test,composer cs:check,composer psalme verificações CI pertinentes passam. - Documentação do produto não contém garantias incorretas nem narra o processo de implementação; o resultado integrado foi revisado.
Política de documentação — importante
Não transformar docs/, README.md ou outros arquivos Markdown em relatórios de auditoria, diários de implementação, listas de issues em andamento, tabelas de pendências ou descrições de estados transitórios.
Achados, matriz de análise, propostas, screenshots sintéticos e histórico de execução pertencem às issues e aos PRs.
Alterar documentação versionada somente quando necessário para corrigir ou explicar um contrato estável e relevante ao consumidor: por exemplo, corrigir uma garantia de paginação incompatível com a norma. Manter essa alteração mínima, voltada ao comportamento final e sem referências a etapas, commits ou PRs. Não alterar README apenas para registrar trabalho interno.
Limites e coordenação
- Não transmitir NFS-e nem alterar XML autorizado, DPS, cálculos tributários ou sequências fiscais.
- Não usar dados de contribuintes reais nas issues, commits, fixtures, logs, screenshots ou PDFs de evidência.
- Não reabrir trabalhos concluídos apenas por serem relacionados: Validate DANFSe v2 rendering against official NT 008 reference cases #57 fornece base de testes; o PR fix(danfse): alinhar a grade NT 008 e corrigir os campos de localidade #113 já introduziu melhorias que devem ser preservadas.
- A issue fix(danfse): adequar identificação do município e UF no cabeçalho à NT 008 #117 cobre especificamente a identificação municipal/UF no cabeçalho e pode avançar sem aguardar toda a auditoria.
- O PR fix(nfse): restore NT 007 consolidated social retentions in XML and DANFSe #116 contém alterações ainda em revisão relacionadas a outros campos; coordenar para não sobrepor correções.
Referência normativa: https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc/nt-008-se-cgnfse-danfse-20260714-v1-02.pdf
O épico termina somente com a conformidade integrada demonstrada, não com o simples fechamento das issues individuais.
Complemento de aceitação — conformidade jurídica e origem do XML (2026-10)
- Separar claramente renderização da NFS-e autorizada da seleção/validação das obrigações tributárias feita pelo emissor. O DANFSe não deve recalcular IBS/CBS, ISS, retenções ou tributos estimados, nem inferir que a SEFIN autorizou o conteúdo por aceitá-lo.
- Incluir fixtures sintéticas por contrato legado e NT009 somente quando o XML correspondente estiver oficialmente suportado; NT009 preview (
docs/nt009.md) não é contrato de emissão. Se ainda não houver XML autorizado de formato novo, classificar caso como futuro e não inventar saída conforme. - Testar fidelidade
XML autorizado → modelo de exibição → HTML/PDFcampo a campo (presente, ausente,0, condicional, arredondamentos já fixados no XML), e inspecionar PDF uma página segundo NT008 v1.02, com casos extensos sem ocultar campo legal obrigatório. - Validar separadamente conteúdo (semântica fiscal) e forma (NT008); aprovar HTML não prova layout final. Não aplicar snapshot de bytes do PDF.
- O módulo
akaunting-nfse#425é responsável pela origem dos percentuais aproximados enviados; este épico verifica apenas representação fiel do XML autorizado.nfse-php#120verificaregEspTribcomo célula condicional de DANFSe;akaunting-nfse#424verifica elegibilidade de configuração/preenchimento antes da DPS. PR fix(nfse): restore NT 007 consolidated social retentions in XML and DANFSe #116 trata semântica NT007, não deduzir o significado devRetCSLLpelo nome. - Nenhuma mudança em regras de negócio de cálculo ou XSD neste épico. Não exigir chamadas a SEFIN nem dados reais, e não chamar documentação de andamento de contrato estável.
Referências: NT008 (https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/rtc), documentação XSD por ambiente (https://www.gov.br/nfse/pt-br/biblioteca/documentacao-tecnica/documentacao-atual), publicação NT009 (https://www.gov.br/nfse/pt-br/noticias/publicado-o-ato-tecnico-conjunto-rfb-cgibs-no-7-aprovando-a-versao-1-01-da-nota-tecnica-009-nfs-e-e-a-nota-tecnica-010-da-nfs-e-via).
Activity
fix(danfse): preserve public totals model keys while rendering author…
fix(danfse): honor authorized indDest before recipient group (#118)
fix(danfse): remove redundant casts in repeated XML extraction (#118)
fix(danfse): omit IBS base reductions when authorized group is absent (…
fix(danfse): enforce single-page A4 with visible overflow ellipses (#125
fix(danfse): present authorized IBS/CBS amounts and NFS-e totals (#127,
fix(danfse): preserve authorized complementary information and approx…
fix(danfse): restore NT008 A4 border, margins and minimum text hierar…
test(danfse): validate disclosure text across PDF line wraps (#118)
fix(danfse): enforce NT008 federal-retention and ISS no-incidence dis…
6 remaining items
test(danfse): port NT008 XML-to-layout regression scenarios and local…
test(danfse): version stable rendering contract and synthetic PDF che…
fix(danfse): namespace Dompdf font families and keep default renderin…
vitormattos commentedon Oct 12, 2026
Consolidação pós-merge — 12/10/2026
Implementação e auditoria: PR #136 integrado à main no commit 11fa63d (assinatura válida e DCO). A árvore Git do merge e a do HEAD testado f1686a7 são idênticas (ceed28e9894fddf5de0fd0ab76d81ea47e6c159a). CI do HEAD integrado: 10/10 checks verdes. A emissão/consulta/cálculo fiscal e os dados históricos não foram alterados pelo DANFSe.
Provas: workflow 38277928235, artifact 11759872398: nove PDFs sintéticos, todos uma página A4 retrato; casos de descrição longa, regime ausente/0/9, benefício 0, imunidade 0, não incidência e font probe. Revisão com pdfinfo/pdffonts/pdftotext e inspeção de imagens renderizadas. O PR #116 foi integrado de forma independente e suas alterações NT007 estão preservadas. PRs intermediários #123/#125/#127/#129/#130/#133 encerrados como substituídos pelo #136, não mergidos novamente.
Subissues nativas: #117 (cabeçalho), #120 (linhas ISS) e #119 (matriz de conformidade) foram concluídas/fechadas, com evidências e matriz final registrada na discussão de #119.
BLOQUEIO RESIDUAL PARA ENCERRAR ESTE ÉPICO: NT008 v1.02 item 2.4 exige fonte Arial em rótulos e Microsoft Sans Serif em conteúdo. No PDF padrão integrado, pdffonts ainda retorna Helvetica/Helvetica-Bold, logo a conformidade integral não está demonstrada. O PR #136 introduz a configuração opcional DanfseFonts para carregar arquivos TrueType locais, com diretório de cache próprio e famílias CSS isoladas (evitando colisão com o cache estático do Dompdf). O PDF de prova usa DejaVuSans/Bold de licença livre, embedded=yes, e não deve ser apresentado como Arial/Microsoft Sans Serif. Nenhum binário tipográfico proprietário foi redistribuído.
Gate objetivo de aceite restante: (1) obter fontes Arial e Microsoft Sans Serif com licenças que permitam incorporação em PDF, ou decisão normativa fundamentada sobre alternativa; (2) configurar os arquivos locais no ambiente consumidor, usando DanfseConfig(fonts: new DanfseFonts(...)); (3) gerar e inspecionar os casos de referência, texto longo e produção restrita com fontes efetivas, documentando pdffonts, página A4 única, ausência de colisão e sem perder campos; (4) decidir se produção sem fontes oficiais deve falhar explicitamente em vez de produzir DANFSe não conforme, considerando compatibilidade de consumidores; (5) só então fechar #118. O merge da biblioteca por si só não atualiza versões/pins ou caches de consumidores e não equivale a uma publicação de release.
Resultado: todo o escopo implementável sem as fontes licenciadas está integrado e validado; o épico permanece aberto especificamente para o bloqueio tipográfico, não por CI ou conflito de merge. Não há outros PRs pendentes desta frente.
[-]epic(danfse): garantir conformidade integral do DANFSe v2 com a NT 008[/-][+]epic(danfse): concluir apresentação NT008 v1.02 com divergência tipográfica documentada[/+]vitormattos commentedon Oct 12, 2026
Decisão arquitetural — tipografia livre
A implementação adotará Liberation Sans Regular e Bold incorporadas como fontes padrão do DANFSe, sem instalação ou redistribuição automática de Arial ou Microsoft Sans Serif.
A escolha preserva o objetivo de fidelidade funcional e visual, independência operacional e redistribuição sob licença livre, mas constitui divergência nominal conhecida em relação ao item 2.4 da NT008 v1.02.
O aceite requer comprovação das fontes efetivas e incorporadas no PDF, empacotamento e atribuições corretos, testes de renderização e página A4 única, ausência de fallback inesperado, preservação do contrato público e homologação do consumidor Akaunting.
O encerramento do épico poderá registrar a implementação como concluída com divergência tipográfica conhecida e documentada. Não deverá declarar conformidade tipográfica literal nem homologação oficial da substituição.
fix(test): stream Poppler raster to physical margin verifier (#118)
fix(danfse): align QR horizontal and vertical anchors (#118)
Merge pull request #140 from LibreCodeCoop/docs/danfse-legacy-ibs-cbs…
Merge pull request #141 from LibreCodeCoop/fix/danfse-qr-y-nt008-118-…
test(danfse): verify rendered physical A4 margins (#118)
Merge pull request #139 from LibreCodeCoop/fix/danfse-nt008-physical-…
vitormattos commentedon Oct 13, 2026
Homologação final DANFSe NT008 v1.02 — 13/10/2026
A implementação e a verificação geométrica foram concluídas com a integração do PR #139 no commit
2b52325f253db74a0da2ee18a3e1b27a7bfbe31f.Evidências finais
38394438347, artifact11810683875, SHA75f127fa: 10 PDFs inteiramente sintéticos, uma página A4 retrato cada.nfse-phpaprovados na SHA final, sem regressão da paginação com fontes personalizadas.Integração do consumidor
O PR
LibreCodeCoop/akaunting-nfse#472foi integrado no commitc54bbd032104c2645746720d76566404a48e974c, fixandonfse-phpem2b52325f253db74a0da2ee18a3e1b27a7bfbe31f. O runtime escopado e o empacotamento DANFSe passaram na CI. A atualização de instalações existentes continua sendo uma operação independente.Ressalva normativa
A implementação utiliza Liberation Sans Regular/Bold incorporadas por decisão arquitetural expressa. Essa fonte não é literalmente Arial/Microsoft Sans Serif, como especificado pela NT008 v1.02. Portanto, o resultado não deve ser apresentado como conformidade tipográfica literal ou homologação oficial dessa substituição.
Decisão proposta
Aceitar a implementação como concluída, com a divergência tipográfica nominal conhecida, fundamentada e documentada, e encerrar o épico como
completed. Não declarar homologação normativa integral sem ressalvas.