From 9b125f513e555a2d6073076c9035af292fe1202d Mon Sep 17 00:00:00 2001 From: Gabriela Cavalcante da Silva Date: Fri, 31 Jan 2020 16:52:22 -0300 Subject: [PATCH] fix nfse natal --- .gitignore | 2 + nfse-example.py | 51 +++++----- pytrustnfe/nfe/assinatura.py | 13 +-- pytrustnfe/nfse/natal/__init__.py | 57 ++++++++--- pytrustnfe/nfse/natal/templates/EnvelopeSoap.xml | 8 ++ .../nfse/natal/templates/Exemplo_LoteRPS.xml | 111 +++++++++++++++++++++ pytrustnfe/nfse/natal/templates/Rps.xml | 85 +++++++++------- pytrustnfe/nfse/natal/templates/cabecalho.xml | 3 + .../nfse/natal/templates/recepcionarLoteRps.xml | 6 +- pytrustnfe/nfse/susesu/templates/EnviarNota.xml | 9 +- pytrustnfe/xml/__init__.py | 7 +- tests/test_nfse_natal.py | 2 +- 12 files changed, 261 insertions(+), 93 deletions(-) create mode 100644 pytrustnfe/nfse/natal/templates/EnvelopeSoap.xml create mode 100644 pytrustnfe/nfse/natal/templates/Exemplo_LoteRPS.xml create mode 100644 pytrustnfe/nfse/natal/templates/cabecalho.xml diff --git a/.gitignore b/.gitignore index f956822..e09118a 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ docs/_build .cache .pytest_cache .vscode/ +*.pfx +sent_xml.xml \ No newline at end of file diff --git a/nfse-example.py b/nfse-example.py index 1c3cc81..b734050 100644 --- a/nfse-example.py +++ b/nfse-example.py @@ -1,3 +1,4 @@ +import ipdb import xml.dom.minidom import os from pytrustnfe.nfse.natal import recepcionar_lote_rps @@ -9,46 +10,45 @@ rps_list = [ "numero": "1", "serie": "UNICA", "tipo_rps": "1", - "data_emissao": "2020-01-279", + "data_emissao": "2010-06-16T21:00:00", "natureza_operacao": "1", "regime_tributacao": "1", "optante_simples": "1", "incentivador_cultural": "2", + "status": "1", "servico": { "valor_servico": "1.00", + "pis": "0", + "cofins": "0", + "inss": "0", + "ir": "0", + "csll": "0", "iss_retido": "2", + "iss": "2", + "retencoes": "2", "base_calculo": "0.00", + "aliquota": "2", "codigo_servico": "01.07", "cnae_servico": "6209100", - "descricao": "Sistema NFSe", + "discriminacao": "Sistema NFSe", "codigo_municipio": "2408102", }, "prestador": { "cnpj": "23809070000190", - "inscricao_municipal": "2143992", - "razao_social": "SERVICOS DE TI", - "fantasia": "SERVICOS DE TI", - "endereco": "AV AMINTAS", - "numero": "3755", - "complemento": "SALA 32", - "bairro": "Lagoa Nova", - "codigo_municipio": "2408102", - "uf": "RN", - "cep": "59075810", - "telefone": "4132095554", - "email": "SUPORTE@EMAIL.COM.BR", + "inscricao_municipal": "2143992" }, "tomador": { "cpf_cnpj": "01812418000166", + "inscricao_municipal": "2143992", "razao_social": "LEONIR", "endereco": "RUA GROBEIRO", "numero": "128", + "complemento": "ANDAR 14", "bairro": "Lagoa Nova", - "cidade": "3159506", + "codigo_municipio": "3159506", "uf": "BH", - "cep": "1231231313", + "cep": "30160010", "email": "leonir@yahoo.com.br", - "orgao_gerador": {"codigo_municipio": "3159506"}, }, } ] @@ -60,15 +60,18 @@ nfse = { } caminho = os.path.dirname(__file__) -pfx_source = open(os.path.join(caminho, "tests/teste.pfx"), "rb").read() -pfx = Certificado(pfx_source, "123456") +pfx_source = open(os.path.join(caminho, "tsmx-a1.pfx"), "rb").read() +pfx = Certificado(pfx_source, "12345678") retorno = recepcionar_lote_rps(pfx, nfse=nfse, ambiente="homologacao") -# dom = xml.dom.minidom.parseString(retorno['received_xml']) -# received_xml = dom.toprettyxml() -# print(received_xml) - -dom = xml.dom.minidom.parseString(retorno.get("sent_xml")) +dom = xml.dom.minidom.parseString(retorno['sent_xml']['nfseDadosMsg']) sent_xml = dom.toprettyxml() print(sent_xml) + +myfile = open("sent_xml.xml", "w") +myfile.write(sent_xml) + +dom = xml.dom.minidom.parseString(retorno['received_xml']) +received_xml = dom.toprettyxml() +print(received_xml) diff --git a/pytrustnfe/nfe/assinatura.py b/pytrustnfe/nfe/assinatura.py index d513967..dea76d4 100644 --- a/pytrustnfe/nfe/assinatura.py +++ b/pytrustnfe/nfe/assinatura.py @@ -24,9 +24,10 @@ class Assinatura(object): method=signxml.methods.enveloped, signature_algorithm="rsa-sha1", digest_algorithm="sha1", - c14n_algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315", + c14n_algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments", ) - + #import ipdb + #ipdb.set_trace() ns = {} ns[None] = signer.namespaces["ds"] signer.namespaces = ns @@ -37,11 +38,11 @@ class Assinatura(object): ) if reference: element_signed = signed_root.find(".//*[@Id='%s']" % reference) - signature = signed_root.find( + signature = signed_root.findall( ".//{http://www.w3.org/2000/09/xmldsig#}Signature" ) - + if element_signed is not None and signature is not None: - parent = element_signed.getparent() - parent.append(signature) + element_intern = element_signed.getchildren() + element_intern.append(signature) return etree.tostring(signed_root, encoding=str) diff --git a/pytrustnfe/nfse/natal/__init__.py b/pytrustnfe/nfse/natal/__init__.py index cfc9ec5..3998efb 100644 --- a/pytrustnfe/nfse/natal/__init__.py +++ b/pytrustnfe/nfse/natal/__init__.py @@ -2,6 +2,9 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import os +from OpenSSL import crypto +from base64 import b64encode + from requests import Session from zeep import Client from zeep.transports import Transport @@ -12,24 +15,45 @@ from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key from pytrustnfe.nfe.assinatura import Assinatura +def sign_rps(path, certificado, **kwargs): + if "nfse" in kwargs: + lote = "" + for item in kwargs["nfse"]["lista_rps"]: + data = {"rps": item} + xml_rps = render_xml(path, "Rps.xml", True, **data) + + signer = Assinatura(certificado.pfx, certificado.password) + lote += signer.assina_xml( + xml_rps, f"rps:{item.get('numero')}{item.get('serie')}" + ) + return lote + return "" + + def _render(certificado, method, **kwargs): path = os.path.join(os.path.dirname(__file__), "templates") - xml_send = render_xml(path, "%s.xml" % method, True, **kwargs) + lote = "" + if method == "RecepcionarLoteRps": + lote = sign_rps(path, certificado, **kwargs) + + kwargs["lote"] = lote + xml_send = render_xml(path, "%s.xml" % method, False, **kwargs) - reference = "" signer = Assinatura(certificado.pfx, certificado.password) - xml_send = signer.assina_xml(xml_send, reference) + referencia = "lote" + xml_send = signer.assina_xml(xml_send, f"{referencia}") return xml_send def _send(certificado, method, **kwargs): base_url = "" if kwargs["ambiente"] == "producao": - base_url = "https://aparecida.siltecnologia.com.br/tbw/services/Abrasf10?wsdl" + base_url = "" # https://wsnfsev1.natal.rn.gov.br:8444" else: - base_url = "https://aparecida.siltecnologia.com.br/tbwhomologacao/services/Abrasf10?wsdl" + base_url = "https://wsnfsev1homologacao.natal.rn.gov.br:8443/axis2/services/NfseWSServiceV1?wsdl" - cert, key = extract_cert_and_key_from_pfx(certificado.pfx, certificado.password) + cert, key = extract_cert_and_key_from_pfx( + certificado.pfx, certificado.password) cert, key = save_cert_key(cert, key) disable_warnings() @@ -38,24 +62,29 @@ def _send(certificado, method, **kwargs): session.verify = False transport = Transport(session=session) - client = Client(base_url, transport=transport) - - xml_send = kwargs["xml"] - response = client.service[method](xml_send) + client = Client(wsdl=base_url, transport=transport) + xml_send = {} + xml_send = { + "nfseDadosMsg": kwargs["xml"], + "nfseCabecMsg": """ + + 1 + """, + } + + response = client.service[method](**xml_send) response, obj = sanitize_response(response) return {"sent_xml": xml_send, "received_xml": response, "object": obj} def xml_recepcionar_lote_rps(certificado, **kwargs): - return _render(certificado, "recepcionarLoteRps", **kwargs) + return _render(certificado, "RecepcionarLoteRps", **kwargs) def recepcionar_lote_rps(certificado, **kwargs): if "xml" not in kwargs: kwargs["xml"] = xml_recepcionar_lote_rps(certificado, **kwargs) - print(kwargs["xml"]) - return {"sent_xml": kwargs["xml"]} - # return _send(certificado, 'recepcionarLoteRps', **kwargs) + return _send(certificado, "RecepcionarLoteRps", **kwargs) def xml_consultar_lote_rps(certificado, **kwargs): diff --git a/pytrustnfe/nfse/natal/templates/EnvelopeSoap.xml b/pytrustnfe/nfse/natal/templates/EnvelopeSoap.xml new file mode 100644 index 0000000..0c99a49 --- /dev/null +++ b/pytrustnfe/nfse/natal/templates/EnvelopeSoap.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/pytrustnfe/nfse/natal/templates/Exemplo_LoteRPS.xml b/pytrustnfe/nfse/natal/templates/Exemplo_LoteRPS.xml new file mode 100644 index 0000000..1a0c0d0 --- /dev/null +++ b/pytrustnfe/nfse/natal/templates/Exemplo_LoteRPS.xml @@ -0,0 +1,111 @@ + + + 1 + 27596568000505 + 1000047 + 1 + + + + + 1 + ABCDH + 1 + + 2010-06-16T21:00:00 + 1 + 6 + 1 + 2 + 1 + + + 1000 + 10 + 10 + 10 + 10 + 10 + 1 + 50 + 10 + 1000 + 0.05 + + 11.01 + 4520005 + Teste. + 3106200 + + + 27596568000505 + 1000047 + + + + + 24533572000102 + + 1000039 + + INSCRICAO DE TESTE SIATU - DAGUA -PAULINOS + + DA BAHIA + 200 + ANDAR 14 + CENTRO + 2408102 + RN + 30160010 + + + marcelo@teste.com.br + + + + 1234 + 1234 + + + + + + + + + + + + mMyQLAm4psxx52kaD8Jlta3ouPM= + + + qBKfaNz6RbsYUxCOrjGZ9zrdgiGL7QSBxjlhYRlKDNlDERlDWvM8gi28yus8FoUb0v2CTKKIBz0tzfqxgk60rke4YCMkTzdWfpm7ofMIhYC9VHqbWdInC20znOKygJy5hyIx6JBoyXbejnw/0KF+2E1P1ZehqXJWZqY+KPaIGAY= + + + MIIE7DCCA9SgAwIBAgIQZMlLC9ZEsHWsnvJNdMI2yzANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDEsMCoGA1UECxMjU2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgLSBTUkYxGDAWBgNVBAMTD0FDIFBST0RFTUdFIFNSRjAeFw0wNzEwMzEwMDAwMDBaFw0xMDEwMzAyMzU5NTlaMIGQMQswCQYDVQQGEwJCUjETMBEGA1UEChQKSUNQLUJyYXNpbDEqMCgGA1UECxQhU2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwtU1JGMRIwEAYDVQQLFAlTUkYgZS1DUEYxLDAqBgNVBAMTI0VER0FSIERPIENBUk1PIEZFUlJFSVJBOjQzMjYwMTUyNjg3MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6M+9XT5KLQN3IH8mAr+S6vxiochY/EwF8EhtNoxPTYl+zr0Dh+eZsRG31bN410nr2OrwncrRorMK8Ngq+j3FnNF0nIMigaaa5NAEfIk3Yy4kuqrTUZBpqUJvCqc3mkF3C3XD0MTmtbVTWCvYIk+qn3t5ShHyMnQcuah5Q0ItSbQIDAQABo4IB6TCCAeUwgZUGA1UdEQSBjTCBiqA9BgVgTAEDAaA0BDIyMTAzMTk2NDQzMjYwMTUyNjg3MDAwMDAwMDAwMDAwMDAwMDBNLTI4ODQwODVTU1BNR6AXBgVgTAEDBqAOBAwwMDAwMDAwMDAwMDCgHgYFYEwBAwWgFQQTMDAwMDAwMDAwMDAwMDAwMDAwMIEQZWRnYXJAcGJoLmdvdi5icjAJBgNVHRMEAjAAMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly9pY3AtYnJhc2lsLmNlcnRpc2lnbi5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDUFJPREVNR0VTUkYvTGF0ZXN0Q1JMLmNybDAfBgNVHSMEGDAWgBTdO9vtjZcRRUMBQ020Ev0O7niacDAOBgNVHQ8BAf8EBAMCBeAwVQYDVR0gBE4wTDBKBgZgTAECAxQwQDA+BggrBgEFBQcCARYyaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9kcGMwHQYDVR0lBBYwFAYIKwYBBQUHAwQGCCsGAQUFBwMCMDgGCCsGAQUFBwEBBCwwKjAoBggrBgEFBQcwAYYcaHR0cDovL29jc3AuY2VydGlzaWduLmNvbS5icjANBgkqhkiG9w0BAQUFAAOCAQEAYFcjZj4lGVEREHBaHtcRletWS6/mvpkxmodwj3ele5yXsxuqSZd7ebHbKewXx7gkyaWFkFAxFanQhls2tYKjg6haqt2b0AO1FsitVIHkMcxRwkU9G+1ec8yfdxymra2VdXazkxuvqKABgxkqKnaFdHjje7cjWDgwparymH64mTlHkSQz59GutJW0xfwBHcMGx0/9/iIug6pfMQivWf0NMVpFNzxO5ZNPEuOeBhVDxQr4+KB+4B9xDai/3J6f42UNbSy+z3xuB0K8/7V7BsFUYOYFSNnBrXhvbvXtZOtteX65V0r1+RJJX5OK+PAPhZ57T1LEmHMggdo5kli3Nr1KFQ== + + + + + + + + + + + + + + + + n42EhtzDSnZ071g+44ZMBCc74UQ= + + + pQyeXnJ2S9KyUJ1BE3k3PZuDpk7WkD2nMPLoELSLJeNBe9TwmLhImsIUS4inAUreuTsjfrs2BUmChN6jPA0/1cSR0GbblLsHFN+IwPE2dnPN/u0vIOmsan4MuW1OnlH6KexmDHRj/uFwjoXfSJ0JJE1u9bYdbsp5LGlFuc//CCQ= + + + MIIE7DCCA9SgAwIBAgIQZMlLC9ZEsHWsnvJNdMI2yzANBgkqhkiG9w0BAQUFADBqMQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDEsMCoGA1UECxMjU2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwgLSBTUkYxGDAWBgNVBAMTD0FDIFBST0RFTUdFIFNSRjAeFw0wNzEwMzEwMDAwMDBaFw0xMDEwMzAyMzU5NTlaMIGQMQswCQYDVQQGEwJCUjETMBEGA1UEChQKSUNQLUJyYXNpbDEqMCgGA1UECxQhU2VjcmV0YXJpYSBkYSBSZWNlaXRhIEZlZGVyYWwtU1JGMRIwEAYDVQQLFAlTUkYgZS1DUEYxLDAqBgNVBAMTI0VER0FSIERPIENBUk1PIEZFUlJFSVJBOjQzMjYwMTUyNjg3MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6M+9XT5KLQN3IH8mAr+S6vxiochY/EwF8EhtNoxPTYl+zr0Dh+eZsRG31bN410nr2OrwncrRorMK8Ngq+j3FnNF0nIMigaaa5NAEfIk3Yy4kuqrTUZBpqUJvCqc3mkF3C3XD0MTmtbVTWCvYIk+qn3t5ShHyMnQcuah5Q0ItSbQIDAQABo4IB6TCCAeUwgZUGA1UdEQSBjTCBiqA9BgVgTAEDAaA0BDIyMTAzMTk2NDQzMjYwMTUyNjg3MDAwMDAwMDAwMDAwMDAwMDBNLTI4ODQwODVTU1BNR6AXBgVgTAEDBqAOBAwwMDAwMDAwMDAwMDCgHgYFYEwBAwWgFQQTMDAwMDAwMDAwMDAwMDAwMDAwMIEQZWRnYXJAcGJoLmdvdi5icjAJBgNVHRMEAjAAMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly9pY3AtYnJhc2lsLmNlcnRpc2lnbi5jb20uYnIvcmVwb3NpdG9yaW8vbGNyL0FDUFJPREVNR0VTUkYvTGF0ZXN0Q1JMLmNybDAfBgNVHSMEGDAWgBTdO9vtjZcRRUMBQ020Ev0O7niacDAOBgNVHQ8BAf8EBAMCBeAwVQYDVR0gBE4wTDBKBgZgTAECAxQwQDA+BggrBgEFBQcCARYyaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9kcGMwHQYDVR0lBBYwFAYIKwYBBQUHAwQGCCsGAQUFBwMCMDgGCCsGAQUFBwEBBCwwKjAoBggrBgEFBQcwAYYcaHR0cDovL29jc3AuY2VydGlzaWduLmNvbS5icjANBgkqhkiG9w0BAQUFAAOCAQEAYFcjZj4lGVEREHBaHtcRletWS6/mvpkxmodwj3ele5yXsxuqSZd7ebHbKewXx7gkyaWFkFAxFanQhls2tYKjg6haqt2b0AO1FsitVIHkMcxRwkU9G+1ec8yfdxymra2VdXazkxuvqKABgxkqKnaFdHjje7cjWDgwparymH64mTlHkSQz59GutJW0xfwBHcMGx0/9/iIug6pfMQivWf0NMVpFNzxO5ZNPEuOeBhVDxQr4+KB+4B9xDai/3J6f42UNbSy+z3xuB0K8/7V7BsFUYOYFSNnBrXhvbvXtZOtteX65V0r1+RJJX5OK+PAPhZ57T1LEmHMggdo5kli3Nr1KFQ== + + + + \ No newline at end of file diff --git a/pytrustnfe/nfse/natal/templates/Rps.xml b/pytrustnfe/nfse/natal/templates/Rps.xml index 9dcd23c..3bec297 100644 --- a/pytrustnfe/nfse/natal/templates/Rps.xml +++ b/pytrustnfe/nfse/natal/templates/Rps.xml @@ -1,5 +1,5 @@ - + {{ rps.numero }} {{ rps.serie }} @@ -10,47 +10,57 @@ {{ rps.regime_tributacao }} {{ rps.optante_simples }} {{ rps.incentivador_cultural }} + {{ rps.status }} {{ rps.servico.valor_servico }} + {{ rps.servico.pis }} + {{ rps.servico.cofins }} + {{ rps.servico.inss }} + {{ rps.servico.ir }} + {{ rps.servico.csll }} {{ rps.servico.iss_retido }} + {{ rps.servico.iss }} + {{ rps.servico.retencoes }} {{ rps.servico.base_calculo }} + {{ rps.servico.aliquota }} {{ rps.servico.codigo_servico }} - {{ rps.servico.cnae_servico }} - {{ rps.servico.codigo_tributacao_municipio }} - {{ rps.servico.descricao }} + {{ rps.servico.cnae_servico }} + {{ rps.servico.discriminacao }} {{ rps.servico.codigo_municipio }} - - - {{ rps.prestador.cnpj }} - {{ rps.prestador.inscricao_municipal }} - + + {{ rps.prestador.cnpj }} + {{ rps.prestador.inscricao_municipal }} {{ rps.prestador.razaosocial }} {{ rps.prestador.fantasia }} - {{ rps.prestador.endereco }} - {{ rps.prestador.numero }} - {{ rps.prestador.complemento }} - {{ rps.prestador.bairro }} - {{ rps.prestador.codigomunicipal }} - {{ rps.prestador.uf }} - {{ rps.prestador.cep }} + {{ rps.prestador.endereco }} + {{ rps.prestador.numero }} + {{ rps.prestador.complemento }} + {{ rps.prestador.bairro }} + {{ rps.prestador.codigomunicipal }} + {{ rps.prestador.uf }} + {{ rps.prestador.cep }} - - {{ rps.prestador.telefone }} - {{ rps.prestador.email }} + + {% if rps.prestador.telefone is defined -%} + {{ rps.prestador.telefone }} + {% endif %} + {% if rps.prestador.email is defined -%} + {{ rps.prestador.email }} + {% endif %} - - + + - {% if rps.tomador.cnpj_cpf|length == 14 %} - {{ rps.tomador.cnpj_cpf }} + {% if rps.tomador.cpf_cnpj|length == 14 %} + {{ rps.tomador.cpf_cnpj }} {% endif %} - {% if rps.tomador.cnpj_cpf|length == 11 %} - {{ rps.tomador.cnpj_cpf }} + {% if rps.tomador.cpf_cnpj|length == 11 %} + {{ rps.tomador.cpf_cnpj }} {% endif %} {% if rps.tomador.inscricao_municipal is defined -%} @@ -59,29 +69,29 @@ {{ rps.tomador.razao_social }} - {{ rps.tomador.logradouro }} - {{ rps.tomador.numero }} - {% if rps.tomador.complemento is defined -%} - {{ rps.tomador.complemento }} - {% endif %} - {{ rps.tomador.bairro }} - {{ rps.tomador.codigo_municipio }} - {{ rps.tomador.uf }} - {{ rps.tomador.cep }} + {{ rps.tomador.endereco }} + {{ rps.tomador.numero }} + {{ rps.tomador.complemento }} + {{ rps.tomador.bairro }} + {{ rps.tomador.codigo_municipio }} + {{ rps.tomador.uf }} + {{ rps.tomador.cep }} {% if rps.tomador.telefone is defined -%} {{ rps.tomador.telefone }} {% endif %} {% if rps.tomador.email is defined -%} - {{ rps.tomador.email }} + {{ rps.tomador.email }} {% endif %} + {% if rps.tomador.orgao_gerador is defined -%} {{ rps.tomador.orgao_gerador.codigo_municipio }} {{ rps.tomador.orgao_gerador.uf }} - + {% endif %} + {% if rps.intermediario is defined -%} {{ rps.intermediario.razao_social }} @@ -98,4 +108,5 @@ {% endif %} - + + \ No newline at end of file diff --git a/pytrustnfe/nfse/natal/templates/cabecalho.xml b/pytrustnfe/nfse/natal/templates/cabecalho.xml new file mode 100644 index 0000000..e02734c --- /dev/null +++ b/pytrustnfe/nfse/natal/templates/cabecalho.xml @@ -0,0 +1,3 @@ + + 2.01 + \ No newline at end of file diff --git a/pytrustnfe/nfse/natal/templates/recepcionarLoteRps.xml b/pytrustnfe/nfse/natal/templates/recepcionarLoteRps.xml index 0756b0e..5dcd922 100644 --- a/pytrustnfe/nfse/natal/templates/recepcionarLoteRps.xml +++ b/pytrustnfe/nfse/natal/templates/recepcionarLoteRps.xml @@ -1,13 +1,11 @@ - + {{ nfse.numero_lote }} {{ nfse.cnpj_prestador }} {{ nfse.inscricao_municipal }} {{ nfse.lista_rps|length }} - {% for rps in nfse.lista_rps -%} - {% include 'Rps.xml' %} - {% endfor %} + {{lote}} diff --git a/pytrustnfe/nfse/susesu/templates/EnviarNota.xml b/pytrustnfe/nfse/susesu/templates/EnviarNota.xml index bf75e03..3b285a2 100644 --- a/pytrustnfe/nfse/susesu/templates/EnviarNota.xml +++ b/pytrustnfe/nfse/susesu/templates/EnviarNota.xml @@ -1,5 +1,6 @@ - - + + + {{ codigo_prefeitura }} @@ -10,5 +11,5 @@ {{ cnpj_prestador }} {{ senha_nfd }} - - + + diff --git a/pytrustnfe/xml/__init__.py b/pytrustnfe/xml/__init__.py index fc261ab..a98283d 100644 --- a/pytrustnfe/xml/__init__.py +++ b/pytrustnfe/xml/__init__.py @@ -17,7 +17,8 @@ def recursively_empty(e): def render_xml(path, template_name, remove_empty, **nfe): nfe = recursively_normalize(nfe) - env = Environment(loader=FileSystemLoader(path), extensions=["jinja2.ext.with_"]) + env = Environment(loader=FileSystemLoader( + path), extensions=["jinja2.ext.with_"]) env.filters["normalize"] = filters.strip_line_feed env.filters["normalize_str"] = filters.normalize_str env.filters["format_percent"] = filters.format_percent @@ -41,7 +42,7 @@ def render_xml(path, template_name, remove_empty, **nfe): if recursively_empty(elem): parent.remove(elem) return root - return etree.tostring(root, encoding=str) + return root def sanitize_response(response): @@ -53,7 +54,7 @@ def sanitize_response(response): continue i = elem.tag.find("}") if i >= 0: - elem.tag = elem.tag[i + 1 :] + elem.tag = elem.tag[i + 1:] objectify.deannotate(tree, cleanup_namespaces=True) return response, objectify.fromstring(etree.tostring(tree)) diff --git a/tests/test_nfse_natal.py b/tests/test_nfse_natal.py index 2c0a8b3..2bf75c1 100644 --- a/tests/test_nfse_natal.py +++ b/tests/test_nfse_natal.py @@ -70,7 +70,7 @@ class test_nfse_natal(unittest.TestCase): def test_recepcionar_lote_rps(self): pfx_source = open(os.path.join(self.caminho, "teste.pfx"), "rb").read() - pfx = Certificado(pfx_source, "123456") + pfx = Certificado(pfx_source, "123456", ambiente="homologacao") nfse = self._get_nfse() path = os.path.join(os.path.dirname(__file__), "XMLs")