diff --git a/pytrustnfe/nfse/bh/__init__.py b/pytrustnfe/nfse/bh/__init__.py index 4c9fd3f..c5f246b 100644 --- a/pytrustnfe/nfse/bh/__init__.py +++ b/pytrustnfe/nfse/bh/__init__.py @@ -2,14 +2,14 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import os - +from lxml import etree from requests import Session from zeep import Client from zeep.transports import Transport from pytrustnfe.certificado import extract_cert_and_key_from_pfx, save_cert_key from pytrustnfe.xml import render_xml, sanitize_response -from pytrustnfe.nfe.assinatura import Assinatura +from pytrustnfe.nfse.bh.assinatura import Assinatura def _render(certificado, method, **kwargs): @@ -18,12 +18,14 @@ def _render(certificado, method, **kwargs): reference = '' if method == 'GerarNfse': - reference = 'r%s' % kwargs['rps']['numero'] + reference = 'rps:%s' % kwargs['rps']['numero'] + ref_lote = 'lote%s' % kwargs['rps']['numero_lote'] elif method == 'CancelarNfse': reference = 'Cancelamento_NF%s' % kwargs['cancelamento']['numero_nfse'] signer = Assinatura(certificado.pfx, certificado.password) xml_send = signer.assina_xml(xml_send, reference) + xml_send = signer.assina_xml(etree.fromstring(xml_send), ref_lote) return xml_send.encode('utf-8') @@ -35,7 +37,9 @@ def _send(certificado, method, **kwargs): base_url = 'https://bhisshomologa.pbh.gov.br/bhiss-ws/nfse?wsdl' xml_send = kwargs["xml"].decode('utf-8') - xml_cabecalho = '' + xml_cabecalho = '\ + \ + 1.00' cert, key = extract_cert_and_key_from_pfx( certificado.pfx, certificado.password) @@ -50,7 +54,7 @@ def _send(certificado, method, **kwargs): response = client.service[method](xml_cabecalho, xml_send) - response, obj = sanitize_response(response) + response, obj = sanitize_response(response.encode('utf-8')) return { 'sent_xml': str(xml_send), 'received_xml': str(response), diff --git a/pytrustnfe/nfse/bh/assinatura.py b/pytrustnfe/nfse/bh/assinatura.py new file mode 100644 index 0000000..1831379 --- /dev/null +++ b/pytrustnfe/nfse/bh/assinatura.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# © 2016 Danimar Ribeiro, Trustcode +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import signxml +from lxml import etree +from pytrustnfe.certificado import extract_cert_and_key_from_pfx +from signxml import XMLSigner + + +class Assinatura(object): + + def __init__(self, arquivo, senha): + self.arquivo = arquivo + self.senha = senha + + def assina_xml(self, xml_element, reference): + cert, key = extract_cert_and_key_from_pfx(self.arquivo, self.senha) + + for element in xml_element.iter("*"): + if element.text is not None and not element.text.strip(): + element.text = None + + signer = XMLSigner( + method=signxml.methods.enveloped, signature_algorithm="rsa-sha1", + digest_algorithm='sha1', + c14n_algorithm='http://www.w3.org/TR/2001/REC-xml-c14n-20010315') + + ns = {} + ns[None] = signer.namespaces['ds'] + signer.namespaces = ns + + ref_uri = ('#%s' % reference) if reference else None + signed_root = signer.sign( + xml_element, key=key.encode(), cert=cert.encode(), + reference_uri=ref_uri) + if reference: + element_signed = signed_root.find(".//*[@Id='%s']" % reference) + signature = signed_root.find(".//*[@URI='#%s']" % reference).getparent().getparent() + + if element_signed is not None and signature is not None: + parent = element_signed.getparent() + parent.append(signature) + return etree.tostring(signed_root, encoding=str) diff --git a/pytrustnfe/nfse/bh/templates/GerarNfse.xml b/pytrustnfe/nfse/bh/templates/GerarNfse.xml index c6ead33..6b35d4d 100644 --- a/pytrustnfe/nfse/bh/templates/GerarNfse.xml +++ b/pytrustnfe/nfse/bh/templates/GerarNfse.xml @@ -1,8 +1,8 @@ - - {{ nfse.numero_lote }} - {{ nfse.cnpj_prestador }} - {{ nfse.inscricao_municipal }} + + {{ rps.numero_lote }} + {{ rps.prestador.cnpj }} + {{ rps.prestador.inscricao_municipal }} 1 {% include 'Rps.xml' %} diff --git a/pytrustnfe/nfse/bh/templates/Rps.xml b/pytrustnfe/nfse/bh/templates/Rps.xml index 7b883af..0dfd0cf 100644 --- a/pytrustnfe/nfse/bh/templates/Rps.xml +++ b/pytrustnfe/nfse/bh/templates/Rps.xml @@ -1,5 +1,5 @@ - + {{ rps.numero }} {{ rps.serie }} diff --git a/setup.py b/setup.py index 17d5399..4bf323b 100644 --- a/setup.py +++ b/setup.py @@ -37,6 +37,7 @@ later (LGPLv2+)', 'nfse/imperial/templates/*xml', 'nfse/floripa/templates/*xml', 'nfse/carioca/templates/*xml', + 'nfse/bh/templates/*xml', 'xml/schemas/*xsd', ]}, url='https://github.com/danimaribeiro/PyTrustNFe',