Repository navigation
fix(nfse): correct NT007 social retentions and validate default description scope - #416
Conversation
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…axes Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
…ntegration Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
af1e21a to
727e006
Compare
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Reviewed Playwright artifact 11767985652 after replacing the legacy description toggle with the three-state save-mode select. Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
|
Revisão técnica da integração (12/10/2026) — HEAD A implementação foi reconstruída sobre a Checks do HEAD final: PHPUnit 8.2/8.3/8.4, Psalm, PHP-CS, migrations, frontend, REUSE, Conventional Commits, DCO, Feature, Smoke e Playwright Full UI: aprovados. A única regressão foi a baseline visual deliberadamente alterada pelo seletor reativo; imagem e hash revisados no commit Pendência para merge — governança, não código: ruleset #22483081 exige 1 aprovação e revisão por CODEOWNER, enquanto A classificação fiscal persistente por identidade e papel tributário segue fora deste PR ( |
Diagnóstico
Revisão dos XMLs e da documentação federal: a NT SE/CGNFS-e 007/2026 (p. 6) determina que
vRetCSLLseja a soma das retenções efetivas de PIS, COFINS e CSLL selecionadas emtpRetPisCofins, apesar da nomenclatura histórica. O PR #413 incorretamente passou a enviar apenas a parcela individual de CSLL, provocando E0724 quandotpRetPisCofins=4e PIS/COFINS foram retidos.O cenário de regressão é uma operação com retenções efetivas de PIS e COFINS, sem CSLL retida. A NT007 determina que
vRetCSLLtransporte a soma das contribuições sociais retidas selecionadas emtpRetPisCofins, sem criar CSLL individual fictícia. Os valores de casos reais não são reproduzidos nesta descrição.Correção proposta
FederalSocialRetentionCalculator::calculate(... )['total']como valor destinado afederalValorCsll.vPis/vCofins) e contribuições efetivamente retidas.nfse_description_scopeinválido sem erro interno, preservando validação de escopo e resposta traduzida ememitereemit.Homologação do formulário de reemissão — diagnóstico da falha persistente
A tela podia mostrar "Padrão para todos os clientes" e mesmo assim produzir
Invalid NFS-e description scope. O formulário dinâmico do Akaunting cria seu objetoFormlendo o atributovaluedos selects HTML e serializa esse objeto, não necessariamente o valor selecionado no DOM. O select anterior não declaravavaluenem vinculava a mudança aform.nfse_description_scope; a requisição enviava valor vazio.Correção UX/contrato: o modal compartilhado de emissão e reemissão agora utiliza um único select reativo
nfse_description_save_mode, com três opções:none(padrão; não salva),general(todos os clientes da empresa atual) ecustomer(somente este cliente). O atributovalue="none"inicializa corretamente o formulário do Akaunting ev-modelmantém o envio sincronizado com o select visível. Os caminhos anteriores da listagem comnfse_save_default_description+nfse_description_scopecontinuam aceitos, com validação de escopo e fronteiras de empresa.Testes acrescentados: persistência geral, recusa de salvamento padrão, isolamento por cliente e empresa, rejeição sem transmitir nova NFS-e e captura do POST real no modal E2E (alternância de opções, preenchimento do e-mail e comprovação de
nfse_description_save_mode=general).A interface da listagem continua no modelo anterior por compatibilidade; sua refatoração visual poderá ocorrer separadamente. Não há transmissão fiscal real automatizada neste PR.
Cobertura E2E:
e2e/nfse-invoice-show-emit-modal.spec.tscomprovou a serialização do formulário e modo de salvamento com transporte interceptado. Playwright Full UI do HEAD final: success, após revisão e atualização da baseline visual do seletor reativo. Há um cenário opcional de fixture marcado como skipped, não contado como aprovado.País no DANFSe — ajuste integrado de exibição
No
nfse-php #116, a revisão8ed55aabad3077684dc5ab8fb1a41890065186c2apresentaBRno DANFSe quando o código de município no XML é reconhecido na tabela IBGE e mantémcPaisPrestacaoausente para prestação doméstica (regra fiscal E0304). Não confundir derivação visual deBRcom o preenchimento do XML. Ocomposer.jsone o teste de runtime fixam a nova revisão. Reinstalar o runtime3rdpartyem homologação; somente limpar cache não carrega a versão atualizada.Dependência do
nfse-phppara homologação (pin exato)c55c627f65939105fd39dafcfd19841b296d6eba).8ed55aabad3077684dc5ab8fb1a41890065186c2.3rdparty/composer.jsonagora fixadev-main#c55c627f65939105fd39dafcfd19841b296d6eba. O testeScopedRuntimeComposerConfigTestconfere tanto o manifesto quanto a revisão efetivamente instalada pelo Composer.mainnem validar somente a lógica do módulo.composer thirdparty:build:prode conferir osource.referenceporcomposer --working-dir=3rdparty show librecodeoop/nfse-php --format=json. O arquivo3rdparty/composer.locké local/não versionado; se apontar à revisão antiga e impedir o build, resolver essa divergência antes de repetir o build.php artisan optimize:clearno diretório do Akaunting e reiniciar PHP/filas que mantêm OPcache conforme o ambiente, sem pressupor Docker.tpRetPisCofins=4,vRetCSLLconsolidado), descrição padrão geral/específica e substituição/reemissão com conferência de XML/estado fiscal. Não executar testes fiscais em produção.mainforam integrados em oito commits incrementais GPG/DCO, sem squash. CI integral do HEAD final concluída com sucesso, sem liberação da revisão formal exigida.Integração e verificações
Dependência coordenada: nfse-php #116. Não mesclar nem implantar até passar CI, revisão e homologação local sem transmissão real. Antes de reemitir/substituir qualquer NFS-e, consultar estado atual na SEFIN para evitar duplicações. O teste de substituição cobre o delegado interno; não substitui teste integrado do XML com o recibo efetivo.
Fontes oficiais
vRetCSLL.nfse-php/resources/contracts/nt009-dps-v1.04.01-matrix.tsv.Nenhuma operação no gateway fiscal foi executada. Commits assinados com GPG e DCO.
Diagnóstico complementar — classificação e deduplicação fiscal
4de5175preserva linhas tributárias distintas com nome/valor coincidentes, sem tentar substituir a classificação fiscal tipada reservada à refactor: vincular identidade e papel fiscal aos impostos do Akaunting #428.FederalTaxSnapshotBuilder::bucketFromName) ainda precisa evoluir para um contrato fiscal explícito por identidade de imposto, tipo de incidência e proveniência. A lacuna está coordenada pela issue #427 e pelas suas dependências; não significa que o presente PR resolva conformidade fiscal integral.Estado de integração em 12/10/2026
99498c1f19b0b18257d07d23077948c2f9a9abea(oito commits incrementais assinados com GPG e DCO; zero commits atrás damain). Os PRs feat(nfse): establish source-backed fiscal assessment contract (#427) #434, feat(nfse): integrar preflight municipal na fronteira de emissão (#376) #435, fix(nfse): preserve versioned approximate-tax provenance across issuance and historical XML #440, feat(nfse): integrar regime de apuração do Simples e regEspTrib na main atual (#424) #441 e feat(nfse): capture cooperative IBS/CBS election facts for 2027 (#427) #442 já integrados foram preservados.nfse-php#116foi mergeado; o3rdparty/composer.jsonfixadev-main#c55c627f65939105fd39dafcfd19841b296d6eba. A CI reconstruiu o PHP-Scoper e confirmou a referência instalada.vRetCSLLsoma contribuições sociais efetivamente retidas selecionadas emtpRetPisCofins;vPis/vCofinsnão representam retenções.success; Dependabotskipped(não é teste); nenhum cancelado, pendente ou com falha. PHPUnit e demais checks, Akaunting Feature e Playwright Full UI aprovados. Baseline visual revisada e atualizada por commit GPG/DCO99498c1..github/CODEOWNERSé* @vitormattos, que também é o autor do PR. Autoaprovação não atende à regra. Nenhum bypass administrativo está autorizado. Solicitar solução legítima de governança ou reatribuição de autoria por fluxo revisado antes do merge.#428e a matriz normativa/conformidade total à#427; não considerar este PR uma homologação fiscal integral.Nenhuma NFS-e real foi transmitida nesta integração, nenhuma nota histórica foi reemitida e nenhuma issue foi criada ou encerrada por este trabalho.