[Bug/Melhoria] Omissão na serialização do grupo ICMSUFDest (DIFAL) nos itens e do CSRT no infRespTec

5 views
Skip to first unread message

Cristian CJS Soluções

unread,
Mar 2, 2026, 2:28:55 PM (12 days ago) Mar 2
to PyNFe

Olá, time do PyNFe! Tudo bem?

Primeiramente, parabéns e muito obrigado pelo excelente trabalho na biblioteca. Tem nos ajudado muito na emissão das notas!

Estou abrindo esta issue para reportar dois pontos que identifiquei no motor de serialização do XML (pynfe/utils/xml_writer.py ou serializacao.py). Notei que os atributos já foram previstos e existem nas classes de entidade, porém não estão sendo renderizados no XML final, o que causa rejeição na SEFAZ (especialmente no PR e em operações interestaduais para consumidor final).

Como workaround, estou injetando as tags manualmente via LXML após a geração da nota, mas seria fantástico ter isso nativo na lib.

Abaixo os detalhes de cada caso:

1. Ausência do grupo <ICMSUFDest> (DIFAL) nos Itens

Na classe NotaFiscalProduto (em entidades.py), os atributos referentes ao DIFAL do item foram devidamente criados:

Python
fcp_destino_valor = Decimal() icms_inter_destino_valor = Decimal() icms_inter_remetente_valor = Decimal()

O Problema: No processo de serialização (função _serializar_produto_servico), são chamados os métodos de todos os impostos (_serializar_imposto_icms, ipi, pis, cofins, ibscbs), mas o grupo <ICMSUFDest> foi esquecido. A serialização pula direto para o <impostoDevol>. Com isso, a SEFAZ rejeita notas interestaduais para não contribuintes por falta da partilha do ICMS no item.

2. Ausência de <idCSRT> e <hashCSRT> no Responsável Técnico

Na classe NotaFiscalResponsavelTecnico, o atributo csrt = str() está presente corretamente. O Problema: Na função _serializar_responsavel_tecnico, apenas os dados básicos são montados:

Python
def _serializar_responsavel_tecnico(self, responsavel_tecnico, tag_raiz="infRespTec", retorna_string=True): raiz = etree.Element(tag_raiz) etree.SubElement(raiz, "CNPJ").text = responsavel_tecnico.cnpj etree.SubElement(raiz, "xContato").text = responsavel_tecnico.contato etree.SubElement(raiz, "email").text = responsavel_tecnico.email etree.SubElement(raiz, "fone").text = responsavel_tecnico.fone # As tags <idCSRT> e <hashCSRT> não são geradas

Para que seja aceito em estados que exigem o CSRT (como o Paraná), é necessário que o serializador receba também a Chave de Acesso (para gerar o hash SHA1 em Base64 do CSRT + Chave) e crie as duas respectivas tags.


Se precisarem de ajuda com algum PR para implementar essas renderizações no serializacao.py, fico à disposição.

Obrigado mais uma vez pelo ótimo projeto!

Reply all
Reply to author
Forward
0 new messages