Skip to content

feat(nfse): INI completo, lote assíncrono e cancelamento no ABRASF - #22

Merged
rodrigofs merged 1 commit into
mainfrom
fix/nfse-grupos-abrasf
Sep 16, 2026
Merged

rodrigofs merged 1 commit into
mainfrom
fix/nfse-grupos-abrasf

Conversation

@rodrigofs

Copy link
Copy Markdown
Contributor

O defeito

No caminho ABRASF a nota saía incompleta sem erro, e dois desfechos voltavam
trocados.

  • O INI do RPS omitia [tribMun], [tribFederal], [totTrib], a Reforma
    Tributária e os grupos de comércio exterior, e escrevia [tribFed], que a lib
    não lê. Outras 156 chaves aceitas pela lib não tinham campo no contrato.
  • No GISS 2.04 o PIS/COFINS com CST, os totais e o IBS/CBS não chegavam ao XML.
    Lote sem percentuais de carga tributária era recusado com E160, e tomador
    com endereço nacional, com 1871 ... EnderecoCompletoExterior.
  • Envio assíncrono apenas aceito voltava autorizado.
  • Cancelamento ABRASF exigia chave, que o provedor não tem, e um cancelamento
    registrado voltava como erro 502.

A causa

No contrato, os grupos eram tratados como exclusivos do Padrão Nacional, mas o
leitor de INI da lib é um só. indTotTrib e tpRetPisCofins tinham
omitempty em campos onde zero é valor válido. O país de pessoas e serviço não
era fixado em 1058 para município brasileiro.

Na lib (r48100), três defeitos:

  • o LerIniRps não lê [IBSCBSNFSE], de onde o gravador do GISS tira
    cLocalidadeIncid, pRedutor e vBC;
  • o releitor do ABRASF 2.04 devolve CodigoPais=0 no endereço nacional, e o
    ciclo CarregarXML + Emitir da transmissão o regera como exterior;
  • o gravador do GISS só emite dois dos três ramos do choice TCTribTotal:
    sem percentuais sai <pTotTribSN>0.00</pTotTribSN>, e indTotTrib nunca
    chega ao XML.

Na borda, Sucesso=1 do envio assíncrono quer dizer lote enfileirado, e o
resultado do cancelamento vem em [RetCancelamento], que não era lido.

A decisão

  • O construtor do ABRASF emite os grupos detalhados e a Reforma com os nomes
    que a lib lê. O contrato passa a cobrir o INI de emissão: as chaves não
    enviadas caem de 156 para 83, e o que sobra é consulta, campo atribuído pelo
    fisco ou seção fora do alcance de um RPS.
  • Três patches sobre o fonte pinado, em docker/acbr-patches, aplicados no
    make acbr-compilar e descritos em docs/ACBRLIB.md. O build da lib falha se
    algum não aplicar limpo.
  • Envio assíncrono aceito sem número volta 202 processando.
    POST /v1/nfse/transmissao/lote consulta o desfecho pelo protocolo e devolve
    o XML da nota quando ela sai. Envio síncrono e Padrão Nacional não mudam.
  • Cancelamento ABRASF localiza a nota pelo número quando não há chave. O
    Padrão Nacional continua exigindo a chave.

Verificação

  • test, vet, fmt-check, openapi-check, enums-conferir,
    acbr-chaves-conferir, yaml-valida e test-cgo.
  • Imagem deste commit com a fumaça do publicar.yml: /readyz responde, os 5
    bindings carregam e a rota nova está no contrato servido.
  • Com a lib patchada, o XML do GISS 2.04 valida no XSD com indTotTrib e o
    grupo IBS/CBS preenchido, e a emissão em produção deixou de ser recusada por
    carga tributária e por endereço. As recusas seguintes foram de cadastro do
    tomador (E417, E418).

Libs

A imagem publicada por este merge usa as .so oficiais do release apontado por
ACBR_LIBS_RELEASE, sem os patches. As libs patchadas vão como anexos do
release desta versão, e um PR seguinte aponta ACBR_LIBS_RELEASE para ele.

O INI do RPS omitia [tribMun], [tribFederal], [totTrib], a Reforma Tributária
e os grupos de comércio exterior, e escrevia [tribFed], nome que a lib não lê.
Outras 156 chaves aceitas pela lib não tinham campo no contrato. O país das
pessoas e do serviço não era fixado para município brasileiro, e indTotTrib e
tpRetPisCofins descartavam o zero, que é valor válido nos dois.

Três defeitos eram da lib e entram como patches sobre a r48100, aplicados no
build dela: o LerIniRps não lia [IBSCBSNFSE], o releitor do ABRASF 2.04
perdia o CodigoPais do endereço nacional, e o gravador do GISS nunca emitia
indTotTrib.

Lote assíncrono aceito voltava como autorizado. Passa a 202 processando, e
POST /transmissao/lote consulta o desfecho, com o XML da nota quando ela sai.
O cancelamento ABRASF exigia chave, que o provedor não tem, e lia o resultado
fora de [RetCancelamento], chamando de erro um cancelamento registrado.
@rodrigofs
rodrigofs merged commit a312c3e into main Sep 16, 2026
10 checks passed
@rodrigofs
rodrigofs deleted the fix/nfse-grupos-abrasf branch September 16, 2026 15:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant