diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index fd75f1a..9c22f3f 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -6,7 +6,7 @@ import os import requests from lxml import etree -from .patch import nfeInutilizacaoCE +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 @@ -66,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) @@ -78,16 +74,33 @@ 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) + else: + 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: @@ -95,14 +108,11 @@ def _send(certificado, method, **kwargs): requests.packages.urllib3.disable_warnings(InsecureRequestWarning) with client.settings(raw_response=True): - if kwargs["estado"] == '23': - response = nfeInutilizacaoCE(session, xml_send) - else: - response = client.service[first_operation](nfeDadosMsg=xml) - response_other, obj = sanitize_response(response.text) + response = client.service[first_operation](xml) + response, obj = sanitize_response(response.text) return { - 'sent_xml': xml_send, # response.request.body.decode('utf-8'), - 'received_xml': response_other, + 'sent_xml': xml_send, + 'received_xml': response, 'object': obj.Body.getchildren()[0] } diff --git a/pytrustnfe/nfe/patch.py b/pytrustnfe/nfe/patch.py index 0c8d210..8cb063f 100644 --- a/pytrustnfe/nfe/patch.py +++ b/pytrustnfe/nfe/patch.py @@ -1,3 +1,14 @@ +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): @@ -11,4 +22,9 @@ def nfeInutilizacaoCE(session, xml_send): response = session.post( 'https://nfeh.sefaz.ce.gov.br/nfe4/services/NFeInutilizacao4', data=soap, headers=headers) - return response + response, obj = sanitize_response(response.text) + return { + 'sent_xml': xml_send, + 'received_xml': response, + 'object': obj.Body.getchildren()[0] + }