-
Notifications
You must be signed in to change notification settings - Fork 178
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
Conversation
Boa tarde, implementei aqui o PR do @ianAraujj e funcionou muito bem. |
There was a problem hiding this 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.
#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) |
There was a problem hiding this comment.
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)) |
There was a problem hiding this comment.
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?
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 |
There was a problem hiding this comment.
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.
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 |
There was a problem hiding this comment.
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.
xml = re.sub( | ||
"<qrCodMDFe>(.*?)</qrCodMDFe>", | ||
lambda x: x.group(0) | ||
.replace("<", "<") | ||
.replace(">", ">") | ||
.replace("amp;", ""), | ||
etree.tostring(xml, encoding="unicode").replace("\n", ""), | ||
'<qrCodMDFe>(.*?)</qrCodMDFe>', | ||
lambda x: x.group(0).replace('<', '<').replace('>', '>').replace('amp;', ''), | ||
xml | ||
) | ||
xml_declaration = '<?xml version="1.0" encoding="UTF-8"?>' |
There was a problem hiding this comment.
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?
Fechado por inatividade. |
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