Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mdfe: atualizacao para o modelo de envio sincrono #348

Closed
wants to merge 1 commit into from

Conversation

ianAraujj
Copy link

Este pull request visa a adicionar um suporte para o envio SÍNCRONO da MDF-e. Atualmente, a biblioteca suporta apenas um envio ASSÍNCRONO, mas esse tipo de envio foi descontinuado pela SEFAZ. No envio SÍNCRONO, os dados do XML devem ser comprimidos no formato GZip e posteriormente codificados em base64. Para funcionar, removi alguns campos do XML como: 'idLote' e 'enviMDFe'. Segundo a documentação, o cabeçalho do SOAP não é obrigatório, apenas o envelope contendo o corpo. Implementei essas mudanças e funcionou para mim nos ambientes de homologação e produção.
Referência da issue

@G3nilson
Copy link

Boa tarde, implementei aqui o PR do @ianAraujj e funcionou muito bem.
Muito obrigado Luccas.

Copy link
Collaborator

@felps-dev felps-dev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Olá, muito obrigado por interagir e contribuir para o projeto! Sua PR é muito bem vinda e vai ajudar a manter a funcionalidade do MDFe-!
Precisamos corrigir os tests que estão falhando e adicionar novos validando essa nova estrutura da MDF-e.

Comment on lines +907 to +914
#raiz = etree.Element("enviMDFe", xmlns=NAMESPACE_MDFE, versao=VERSAO_MDFE)
# A informação do Lote não existe no modelo SINCRONO
#etree.SubElement(raiz, "idLote").text = str(
# id_lote
#) # numero autoincremental gerado pelo sistema
# etree.SubElement(raiz, 'indSinc').text = str(ind_sinc)
# # 0 para assincrono, 1 para sincrono
raiz.append(manifesto)
#raiz.append(manifesto)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Já que isso não vai mais ser utilizado, não precisa comentar, remove.


return 0, retMDFe_element, manifesto
except IndexError as e:
print(str(e))
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pode melhorar isso com um Exception?

Suggested change
print(str(e))
raise Exception("Erro ao..."...

# Extrai o elemento retMDFe (retorno MDF-e)
retMDFe_element = prot.find('.//mdfe:retMDFe', namespaces)

return 0, retMDFe_element, manifesto
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return 0 indica que o lote foi processado e feito com sucesso, mas pode ser que retorne algum erro da SEFAZ, nesse caso ele não pode continuar e precisa retornar 1 com o erro.
Por isso antes tinha a linha if lote_status == self._edoc_situacao_lote_processado:, que acredito que verificava se o lote tinha sido processado com sucesso.
Não tenho muito conhecimento do MDFe, mas se funcionar igual a NFe, vai retornar um 200 com o xmotivo informando o erro de validação.

Comment on lines +1060 to +1073
def compress_and_encode_base64(self, xml_element: etree._Element) -> str:
# Converte o elemento XML para uma string
xml_string = etree.tostring(xml_element, encoding='utf-8')

# Realiza a compressão da string utilizando o GZip
compressed_data = gzip.compress(xml_string)

# Codifica os dados comprimidos para um Base64
base64_encoded_data = base64.b64encode(compressed_data)

# Converte o base64 bytes para string
base64_string = base64_encoded_data.decode('utf-8')

return base64_string
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isso aqui pode ir pra dentro da pasta utils já que pode posteriormente ser utilizado em outros lugares.

Comment on lines 1104 to +1109
xml = re.sub(
"<qrCodMDFe>(.*?)</qrCodMDFe>",
lambda x: x.group(0)
.replace("&lt;", "<")
.replace("&gt;", ">")
.replace("amp;", ""),
etree.tostring(xml, encoding="unicode").replace("\n", ""),
'<qrCodMDFe>(.*?)</qrCodMDFe>',
lambda x: x.group(0).replace('&lt;', '<').replace('&gt;', '>').replace('amp;', ''),
xml
)
xml_declaration = '<?xml version="1.0" encoding="UTF-8"?>'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Qual era o problema de deixar o etree criar a tag header do XML?

@felps-dev
Copy link
Collaborator

Fechado por inatividade.

@felps-dev felps-dev closed this Jan 7, 2025
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.

3 participants