fix(nfse): municípios da API própria do provedor saem no Padrão Nacional - #24
Merged
Merged
Conversation
Em 608 municípios o /v1/nfse/xml devolvia uma DPS com valores do ABRASF: cTribNac "01.05", cTribMun 0, vTotTrib no lugar de pTotTribSN, com validacao.ok. Brasília e Goiânia no ISSNet e Campo Grande no DSF entre eles. Nesses municípios a lib instancia a classe APIPropria do provedor, cujo gravador descende do Padrão Nacional e gera DPS. O roteamento olhava só a família do provedor e mandava o INI do ABRASF. O gerador da tabela passa a marcar esses municípios com a regra da lib (Params com APIPropria:, versão resolvida 1.00 ou 1.01, ramo no GetProvider), e o layout deles é padrao_nacional. As credenciais de prefeitura passam a depender do provedor, não do layout: ABase, EL e ModernizacaoPublica autenticam na API própria. O /xml confere a raiz do XML contra o layout e responde 500 layout_divergente em vez de devolver XML de leiaute trocado. make acbr-tabelas-conferir e make test-integracao-nfse cobram os dois lados.
O gravador do ISSNet pela API própria emite cTribMun obrigatório como inteiro, com StrToIntDef(..., 0). Sem o campo, ou com texto, a DPS saía com <cTribMun>0</cTribMun>, sem alerta da lib, e Brasília recusou com EM020, E244 e EM076. O /xml e a substituição por DPS respondem 400 campo_obrigatorio quando o município é do ISSNet pela API própria e serv.cTribMun não é numérico, não zero e dentro do Integer de 32 bits. Nos demais provedores o campo segue opcional.
rodrigofs
force-pushed
the
fix/nfse-apipropria-layout
branch
from
October 3, 2026 20:34
9031500 to
18e4106
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Em 608 municípios o
POST /v1/nfse/xmldevolvia uma DPS do Padrão Nacional montada com o INI do ABRASF, e respondiavalidacao.ok: true. O XML não servia ao provedor nem ao Padrão Nacional.Exemplo, Brasília (5300108, ISSNet) contra Porto Alegre com o mesmo pedido:
cTribNacsaía01.05em vez de010501, aparecia<cTribMun>0</cTribMun>,opSimpNacia de 3 para 2,regApTribSNsumia epTotTribSNviravavTotTribzerado.Causa
A lib escolhe o gravador por município. Quando os
Paramsdo município ou do provedor têmAPIPropria:e a versão resolvida é 1.00 ou 1.01 (TGeralConfNFSe.SetCodigoMunicipio), oGetProviderinstancia a classe*APIPropriado provedor. O gravador dela descende deTNFSeW_PadraoNacional. Brasília não declaraVersao, herdaVersao=1.01eAPIPropria:da seção[ISSNet], e emite DPS 1.01 pelowsnfsenacionaldo ISSNet.O roteamento daqui decidia só pela família do provedor (
provedor_familia.tsv), e o ISSNet éabrasf_v1_v2.Afetados, por provedor: Betha 227, Pronim 157, ABase 37, EL 31, Citta 23, Coplan 21, ISSNet 20, SimplISS 20, Digifred 13, Fiorilli 12, SilTecnologia 9, Infisc 9, RLZ 8, ModernizacaoPublica 6, Tiplan 4, SpeedGov 3, DBSeller 3, ISSDigital 3, DSF 2.
Mudanças
scripts/gerar-tabelas-nfse.pymarca esses municípios numa quarta coluna demunicipios_provedor.tsv, com a regra da lib. A seção do provedor é buscada sem diferenciar caixa, como noTIniFile: Esperança do Sul declaraProvedor=Abasee a seção é[ABase].LayoutDoMunicipiodevolvepadrao_nacionalpara eles e o pedido vai peloToINI.WSChaveAcessoe ModernizacaoPublica lêWSUsereWSSenhana API própria; com a regra antiga, a troca de layout as descartaria./xmlconfere a raiz do XML contra o layout. Padrão Nacional é raizDPS(o Fiorilli usa namespace próprio) ou qualquer raiz no namespacehttp://www.sped.fazenda.gov.br/nfse(Citta, Digifred, SilTecnologia e DBSeller geramNFSe). Divergência vira500 layout_divergentee o XML não é devolvido.serv.cTribMunpassa a ser obrigatório no ISSNet pela API própria. O gravador o emite como inteiro comStrToIntDef(..., 0), e sem o campo a DPS saía com<cTribMun>0</cTribMun>, que Brasília recusou em homologação com EM020, E244 e EM076. O/xmle a substituição por DPS respondem400 campo_obrigatorio. Nos outros provedores o campo segue opcional: no Padrão Nacional ele é opcional no gravador, e nos dois ABRASF que o exigem (ISSGoiania e Centi) a lib já acusa a tag vazia.make acbr-tabelas-conferirfalha se a tabela divergir do fonte pinado.make test-integracao-nfsegera o XML contra uma API com worker, um município por (provedor, versão, API própria), e cobra a raiz.O que o cliente vê
GET /v1/nfse/municipios/{codigo}e a resposta do/xmlpassam a dizerlayout: padrao_nacionalnesses 608 municípios, com o mesmoprovedor. Para eles valem os campos do Padrão Nacional doinfDPS:serv.cServcom 6 dígitos,regApTribSN,pTotTribSN. No ISSNet,serv.cTribMuné obrigatório.Fora deste PR
substna DPS. Para a maioria isso é o certo, porque as classes APIPropria sobrescrevem oEnviarEvento. O Coplan cancela porCancelaNFSee substitui porSubstituiNFSe, e oito classes herdam o evento do Padrão Nacional sem sobrescrever. Vai num PR separado."" is an invalid integerno lugar do XML. É anterior a este PR, e a guarda não o pega porque provedor próprio pode montar JSON ou TXT.Verificação
make test,vet,fmt-check,openapi-checkeacbr-tabelas-conferirpassam.make test-integracao-nfsecom a API deste branch sobre o worker da v1.3.1: 122 combinações passam, 21 delas com API própria. Contra a API da v1.3.1, falham exatamente essas 21.