From 1dc6c5f738d6079d7cf89985b0b02218b85a6eb5 Mon Sep 17 00:00:00 2001 From: Danimar Date: Sat, 27 Aug 2016 23:29:05 -0300 Subject: [PATCH] =?UTF-8?q?Gerando=20a=20chave=20da=20nfe=20quando=20o=20m?= =?UTF-8?q?=C3=A9todo=20=C3=A9=20de=20autoriza=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/__init__.py | 31 ++++++++++++++++++++++++++----- pytrustnfe/nfe/assinatura.py | 3 ++- pytrustnfe/nfe/comunicacao.py | 13 +++++++------ pytrustnfe/utils.py | 4 ++-- setup.py | 2 +- 5 files changed, 38 insertions(+), 15 deletions(-) diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 21d5912..5b69cd8 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -8,12 +8,31 @@ from .comunicacao import executar_consulta from .assinatura import Assinatura from pytrustnfe.xml import render_xml from pytrustnfe.utils import CabecalhoSoap +from pytrustnfe.utils import gerar_chave, ChaveNFe +from pytrustnfe.Servidores import localizar_url def _build_header(**kwargs): - estado = kwargs['estado'] - return CabecalhoSoap({'estado': estado, 'soap_action': ''}) - + vals = {'estado': kwargs['estado'], 'soap_action': ''} + return CabecalhoSoap(**vals) + +def _generate_nfe_id(**kwargs): + for item in kwargs['NFes']: + vals = { + 'cnpj': item['infNFe']['emit']['cnpj_cpf'], + 'estado': item['infNFe']['ide']['cUF'], + 'emissao': '%s%s' % (item['infNFe']['ide']['dhEmi'][2:4], + item['infNFe']['ide']['dhEmi'][5:7]), + 'modelo': item['infNFe']['ide']['mod'], + 'serie': item['infNFe']['ide']['serie'], + 'numero': item['infNFe']['ide']['nNF'], + 'tipo': item['infNFe']['ide']['tpEmis'], + 'codigo': item['infNFe']['ide']['cNF'], + } + chave = ChaveNFe(**vals) + item['infNFe']['Id'] = gerar_chave(chave, 'NFe') + + def _send(certificado, method, **kwargs): path = os.path.join(os.path.dirname(__file__), 'templates') @@ -22,14 +41,16 @@ def _send(certificado, method, **kwargs): pfx_path = certificado.save_pfx() signer = Assinatura(pfx_path, certificado.password) - xml_signed = signer.assina_xml(xml, '') + xml_signed = signer.assina_xml(xml, kwargs['NFes'][0]['infNFe']['Id']) + url = localizar_url(0, 'RS') cabecalho = _build_header(**kwargs) - return executar_consulta(certificado, cabecalho, xml_signed) + return executar_consulta(certificado, url, cabecalho, xml_signed) def autorizar_nfe(certificado, **kwargs): # Assinar + _generate_nfe_id(**kwargs) _send(certificado, 'NfeAutorizacao', **kwargs) diff --git a/pytrustnfe/nfe/assinatura.py b/pytrustnfe/nfe/assinatura.py index 98b3a40..63d5f19 100644 --- a/pytrustnfe/nfe/assinatura.py +++ b/pytrustnfe/nfe/assinatura.py @@ -38,6 +38,7 @@ class Assinatura(object): self._checar_certificado() self._inicializar_cripto() try: + xml = ']>' + xml doc_xml = libxml2.parseMemory( xml, len(xml)) @@ -47,7 +48,7 @@ class Assinatura(object): doc_xml.getRootElement().addChild(signNode) refNode = signNode.addReference(xmlsec.transformSha1Id(), - None, reference, None) + None, '#' + str(reference), None) refNode.addTransform(xmlsec.transformEnvelopedId()) refNode.addTransform(xmlsec.transformInclC14NId()) diff --git a/pytrustnfe/nfe/comunicacao.py b/pytrustnfe/nfe/comunicacao.py index 8a076d0..9805ea4 100644 --- a/pytrustnfe/nfe/comunicacao.py +++ b/pytrustnfe/nfe/comunicacao.py @@ -5,7 +5,7 @@ from uuid import uuid4 from pytrustnfe.client import HttpClient -from pytrustnfe.certificado import save_cert_key +from pytrustnfe.certificado import save_cert_key, extract_cert_and_key_from_pfx from ..xml import sanitize_response @@ -15,12 +15,13 @@ soap_body_path = './soap:Envelope/soap:Body' soap_fault_path = './soap:Envelope/soap:Body/soap:Fault' -def executar_consulta(cerficado, cabecalho, xmlEnviar): - cert_path, key_path = save_cert_key() - url = '' - web_service = '' +def executar_consulta(certificado, url, cabecalho, xmlEnviar): + cert, key = extract_cert_and_key_from_pfx(certificado.pfx, certificado.password) + cert_path, key_path = save_cert_key(cert, key) + url = 'https://nfe-homologacao.sefazrs.rs.gov.br/ws/NfeAutorizacao/NFeAutorizacao.asmx' + web_service = 'NfeAutorizacao/nfeAutorizacaoLote' client = HttpClient(url, cert_path, key_path) - xml_retorno = client.post_xml(web_service, xmlEnviar) + xml_retorno = client.post_soap(xmlEnviar, web_service) return sanitize_response(xml_retorno) diff --git a/pytrustnfe/utils.py b/pytrustnfe/utils.py index 9abd251..7c69009 100644 --- a/pytrustnfe/utils.py +++ b/pytrustnfe/utils.py @@ -53,9 +53,9 @@ def gerar_chave(obj_chave, prefix=None): assert isinstance(obj_chave, ChaveNFe), "Objeto deve ser do tipo ChaveNFe" obj_chave.validar() - chave_parcial = "%s%s%s%s%s%s%s%s" % (obj_chave.estado, obj_chave.emissao, + chave_parcial = "%s%s%s%s%s%09d%d%08d" % (obj_chave.estado, obj_chave.emissao, obj_chave.cnpj, obj_chave.modelo, - obj_chave.serie, obj_chave.numero, + obj_chave.serie.zfill(3), obj_chave.numero, obj_chave.tipo, obj_chave.codigo) soma = 0 contador = 2 diff --git a/setup.py b/setup.py index 5daabff..f26ccba 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ setup( 'Topic :: Software Development :: Libraries :: Python Modules', ], packages=find_packages(exclude=['*test*']), - package_data={'pytrustnfe': ['xml/*xml', + package_data={'pytrustnfe': ['nfe/templates/*xml', 'nfse/paulistana/templates/*xml']}, url='https://github.com/danimaribeiro/PyNfeTrust', license='LGPL-v2.1+',