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',