From c74893b6584674785113c9a5922247d6ae3c293a Mon Sep 17 00:00:00 2001 From: marinaGD <36993009+marinaGD@users.noreply.github.com> Date: Wed, 19 Dec 2018 20:07:24 -0200 Subject: [PATCH] =?UTF-8?q?[FIX]=20Inutiliza=C3=A7=C3=A3o=20NFe=20CE=20=20?= =?UTF-8?q?-=20Add=20a=20patch=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/__init__.py | 31 ++++++++++++++++++++++--------- pytrustnfe/nfe/patch.py | 30 ++++++++++++++++++++++++++++++ setup.py | 2 +- 3 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 pytrustnfe/nfe/patch.py diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index ac5aad6..0083b3c 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -6,6 +6,7 @@ import os import requests from lxml import etree +from .patch import nfeInutilizacaoCE, has_patch from .assinatura import Assinatura from pytrustnfe.xml import render_xml, sanitize_response from pytrustnfe.utils import gerar_chave, ChaveNFe @@ -65,11 +66,7 @@ def _render(certificado, method, sign, **kwargs): return xml_send -def _send(certificado, method, **kwargs): - xml_send = kwargs["xml"] - base_url = localizar_url( - method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente']) - +def _get_session(certificado): cert, key = extract_cert_and_key_from_pfx( certificado.pfx, certificado.password) cert, key = save_cert_key(cert, key) @@ -77,16 +74,32 @@ def _send(certificado, method, **kwargs): session = Session() session.cert = (cert, key) session.verify = False - transport = Transport(session=session) + return session - parser = etree.XMLParser(strip_cdata=False) - xml = etree.fromstring(xml_send, parser=parser) +def _get_client(base_url, transport): client = Client(base_url, transport=transport) - port = next(iter(client.wsdl.port_types)) first_operation = [x for x in iter( client.wsdl.port_types[port].operations) if "zip" not in x.lower()][0] + return first_operation, client + + +def _send(certificado, method, **kwargs): + xml_send = kwargs["xml"] + base_url = localizar_url( + method, kwargs['estado'], kwargs['modelo'], kwargs['ambiente']) + session = _get_session(certificado) + if has_patch: + return nfeInutilizacaoCE(session, xml_send) + transport = Transport(session=session) + first_op, client = _get_client(base_url, transport) + return _send_zeep(first_op, client, xml_send) + + +def _send_zeep(first_operation, client, xml_send): + parser = etree.XMLParser(strip_cdata=False) + xml = etree.fromstring(xml_send, parser=parser) namespaceNFe = xml.find(".//{http://www.portalfiscal.inf.br/nfe}NFe") if namespaceNFe is not None: diff --git a/pytrustnfe/nfe/patch.py b/pytrustnfe/nfe/patch.py new file mode 100644 index 0000000..8cb063f --- /dev/null +++ b/pytrustnfe/nfe/patch.py @@ -0,0 +1,30 @@ +from ..Servidores import SIGLA_ESTADO +from pytrustnfe.xml import sanitize_response + +methods = [ + 'nfeInutilizacaoCE'] + + +def has_patch(cod_estado, metodo): + uf = SIGLA_ESTADO[cod_estado] + method = metodo+uf + return method in methods + + +def nfeInutilizacaoCE(session, xml_send): + soap = '\ +' + xml_send + '' + headers = { + 'SOAPAction': "", + 'Content-Type': 'application/soap+xml; charset="utf-8"' + } + response = session.post( + 'https://nfeh.sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4', + data=soap, headers=headers) + response, obj = sanitize_response(response.text) + return { + 'sent_xml': xml_send, + 'received_xml': response, + 'object': obj.Body.getchildren()[0] + } diff --git a/setup.py b/setup.py index a18369c..1b5c59d 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.28" +VERSION = "1.0.29" setup(