From a01421febda165ab2e03d8d2629ffb3d477b3f5b Mon Sep 17 00:00:00 2001 From: marinaGD <36993009+marinaGD@users.noreply.github.com> Date: Wed, 15 May 2019 11:19:14 -0300 Subject: [PATCH 1/5] [FIX] servidor consulta svrs --- pytrustnfe/Servidores.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 273d28b..75cd7a8 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -132,7 +132,7 @@ SVRS = { WS_NFE_RECEPCAO_EVENTO: 'ws/recepcaoevento/recepcaoevento4.asmx?wsdl', # noqa WS_NFE_AUTORIZACAO: 'ws/NfeAutorizacao/NFeAutorizacao4.asmx?wsdl', WS_NFE_RET_AUTORIZACAO: 'ws/NfeRetAutorizacao/NFeRetAutorizacao4.asmx?wsdl', # noqa - WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro2.asmx?wsdl', # noqa + WS_NFE_CADASTRO: 'ws/cadconsultacadastro/cadconsultacadastro4.asmx?wsdl', # noqa }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'nfe-homologacao.svrs.rs.gov.br', diff --git a/setup.py b/setup.py index ef532c9..62e8267 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.37" +VERSION = "1.0.38" setup( From fd165c103b13e33fa7e7eadc1ab871afd15006ea Mon Sep 17 00:00:00 2001 From: maiconkkl Date: Wed, 15 May 2019 12:55:50 -0300 Subject: [PATCH 2/5] =?UTF-8?q?Corre=C3=A7ao=20do=20erro=20gerado=20na=20m?= =?UTF-8?q?udan=C3=A7a=20de=20versao=201.0.37=20File=20"/usr/local/lib/pyt?= =?UTF-8?q?hon3.5/dist-packages/PyTrustNFe3-1.0.37-py3.5.egg/pytrustnfe/nf?= =?UTF-8?q?e/templates/NfeAutorizacao.xml",=20line=20262,=20in=20top-level?= =?UTF-8?q?=20template=20code=20=20=20=20=20{{=20NFe.infNFe.compra.x?= =?UTF-8?q?Ped=20}}=20=20=20File=20"/usr/lib/python3/dist-packages/?= =?UTF-8?q?jinja2/environment.py",=20line=20408,=20in=20getattr=20=20=20?= =?UTF-8?q?=20=20return=20getattr(obj,=20attribute)=20jinja2.exceptions.Un?= =?UTF-8?q?definedError:=20'dict=20object'=20has=20no=20attribute=20'compr?= =?UTF-8?q?a'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pytrustnfe/nfe/templates/NfeAutorizacao.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pytrustnfe/nfe/templates/NfeAutorizacao.xml b/pytrustnfe/nfe/templates/NfeAutorizacao.xml index 4bec6b6..0eb2e3c 100644 --- a/pytrustnfe/nfe/templates/NfeAutorizacao.xml +++ b/pytrustnfe/nfe/templates/NfeAutorizacao.xml @@ -259,7 +259,9 @@ {% endfor %} {% endif %} + {% if NFe.infNFe.compra is defined %} {{ NFe.infNFe.compra.xPed }} + {% endif %} {{ prod.nItemPed }} {{ prod.nFCI }} {% for rastro in prod.rastro %} From 9b8a37ce41c12a2216d17d1b3df996c6ae481e0b Mon Sep 17 00:00:00 2001 From: Michael Douglas Pereira de Morais Date: Wed, 15 May 2019 12:57:33 -0300 Subject: [PATCH 3/5] New version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 62e8267..391fe2b 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = "1.0.38" +VERSION = "1.0.39" setup( From cd9b87da94a6e5b530e94471e7bcaff0987a4099 Mon Sep 17 00:00:00 2001 From: maiconkkl Date: Sat, 25 May 2019 22:58:55 -0300 Subject: [PATCH 4/5] Corrigindo as URL de manaus Foi corrigido os webservices da nfce de manaus --- pytrustnfe/Servidores.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/pytrustnfe/Servidores.py b/pytrustnfe/Servidores.py index 75cd7a8..68193be 100644 --- a/pytrustnfe/Servidores.py +++ b/pytrustnfe/Servidores.py @@ -268,23 +268,22 @@ UFAM = { }, NFCE_MODELO: { AMBIENTE_PRODUCAO: { - 'servidor': 'nfe.sefaz.am.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'services2/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'services2/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'services2/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'services2/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'services2/services/NfeConsulta2', - WS_NFE_SITUACAO: 'services2/services/NfeStatusServico2', - WS_NFE_CADASTRO: 'services2/services/cadconsultacadastro2', + 'servidor': 'nfce.sefaz.am.gov.br', + WS_NFE_RECEPCAO_EVENTO: 'nfce-services/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfce-services/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfce-services/services/NfeRetAutorizacao4?wsdl', + WS_NFE_INUTILIZACAO: 'nfce-services/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfce-services/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'nfce-services/services/NfeStatusServico4?wsdl', }, AMBIENTE_HOMOLOGACAO: { 'servidor': 'homnfce.sefaz.am.gov.br', - WS_NFE_RECEPCAO_EVENTO: 'nfce-services-nac/services/RecepcaoEvento', - WS_NFE_AUTORIZACAO: 'nfce-services-nac/services/NfeAutorizacao', - WS_NFE_RET_AUTORIZACAO: 'nfce-services-nac/services/NfeRetAutorizacao', - WS_NFE_INUTILIZACAO: 'nfce-services-nac/services/NfeInutilizacao2', - WS_NFE_CONSULTA: 'nfce-services-nac/services/NfeConsulta2', - WS_NFE_SITUACAO: 'nfce-services-nac/services/NfeStatusServico2', + WS_NFE_RECEPCAO_EVENTO: 'nfce-services/services/RecepcaoEvento4?wsdl', + WS_NFE_AUTORIZACAO: 'nfce-services/services/NfeAutorizacao4?wsdl', + WS_NFE_RET_AUTORIZACAO: 'nfce-services/services/NfeRetAutorizacao4?wsdl', + WS_NFE_INUTILIZACAO: 'nfce-services/services/NfeInutilizacao4?wsdl', + WS_NFE_CONSULTA: 'nfce-services/services/NfeConsulta4?wsdl', + WS_NFE_SITUACAO: 'nfce-services/services/NfeStatusServico4?wsdl', WS_NFCE_QR_CODE: 'http://homnfce.sefaz.am.gov.br/nfceweb/consultarNFCe.jsp', } } From 2ada587c2ad430b6388f08f8891a17f03c685087 Mon Sep 17 00:00:00 2001 From: Ednaldo Batista Barreto <39229285+ImplantiSolucoes@users.noreply.github.com> Date: Fri, 7 Jun 2019 17:13:45 -0300 Subject: [PATCH 5/5] Melhorias no DFeDistribuicao (#230) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Corrigindo as URL de manaus * Alterando função da validação de esquema para não ser feito repetições e poder reutilizar a função só mudando o xsd; Foi alterado o template da função de consultra distribuição do DFe, permitindo consulta via NSU. * Remoção da classe de validação do esquema e deixando somente como função * Atualização do Readme para facilitar o uso das funções xml_consulta_distribuicao_nfe e valida_nfe; --- README.md | 95 ++++++++ pytrustnfe/nfe/__init__.py | 32 +-- pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml | 3 + pytrustnfe/xml/schemas/distDFeInt_v1.01.xsd | 297 ++++++++++++++++++++++++ pytrustnfe/xml/validate.py | 5 +- 5 files changed, 414 insertions(+), 18 deletions(-) create mode 100644 pytrustnfe/xml/schemas/distDFeInt_v1.01.xsd diff --git a/README.md b/README.md index 581f412..e2a6e17 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,102 @@ certificado = Certificado(certificado, 'senha_pfx') obj = {'cnpj': '12345678901234', 'estado': '42'} resposta = consulta_cadastro(certificado, obj=obj, ambiente=1, estado='42') ``` +Consulta Distribuição NF-e sem Validação de Esquema: +```python +from pytrustnfe.certificado import Certificado +from pytrustnfe.nfe import consulta_distribuicao_nfe, xml_consulta_distribuicao_nfe + +certificado = open("/path/certificado.pfx", "r").read() +certificado = Certificado(certificado, 'senha_pfx') + +# Gerando xml e enviado consulta por Ultimo NSU +response1 = consulta_distribuicao_nfe( + certificado, + ambiente=1, + estado='42', + modelo='55', + cnpj_cpf='12345678901234', + ultimo_nsu='123456789101213' +) + +# Gerando xml e enviado consulta por Chave +response2 = consulta_distribuicao_nfe( + certificado, + ambiente=1, + estado='42', + modelo='55', + cnpj_cpf='12345678901234', + chave_nfe='012345678901234567890123456789012345678912' +) + +# Gerando xml e enviado consulta por NSU +response3 = consulta_distribuicao_nfe( + certificado, + ambiente=1, + estado='42', + modelo='55', + cnpj_cpf='12345678901234', + nsu='123456789101213' +) +``` +Consulta Distribuição NF-e com Validação de Esquema: +```python +from pytrustnfe.certificado import Certificado +from pytrustnfe.nfe import consulta_distribuicao_nfe, xml_consulta_distribuicao_nfe +from pytrustnfe.xml.validate import valida_nfe, SCHEMA_DFE + +certificado = open("/path/certificado.pfx", "r").read() +certificado = Certificado(certificado, 'senha_pfx') + +# Gerando XML para Consulta por Ultimo NSU +xml1 = xml_consulta_distribuicao_nfe( + certificado, + ambiente=1, + estado='42', + cnpj_cpf='12345678901234', + ultimo_nsu='123456789101213' +) + +# Validando o XML com Esquema +if valida_nfe(xml1, SCHEMA_DFE): + Warning("Erro na validação do esquema") + +# Gerando XML para Consulta por Chave +xml2 = xml_consulta_distribuicao_nfe( + certificado, + ambiente=1, + estado='42', + cnpj_cpf='12345678901234', + chave_nfe='012345678901234567890123456789012345678912' +) + +# Validando o XML com Esquema +if valida_nfe(xml2, SCHEMA_DFE): + Warning("Erro na validação do esquema") + +# Gerando XML para Consulta por NSU +xml3 = xml_consulta_distribuicao_nfe( + certificado, + ambiente=1, + estado='42', + cnpj_cpf='12345678901234', + nsu='123456789101213' +) + +# Validando o XML com Esquema +if valida_nfe(xml3, SCHEMA_DFE): + Warning("Erro na validação do esquema") + +# Enviando xml de consulta para sefaz +response = consulta_distribuicao_nfe( + certificado, + ambiente=1, + estado='42', + modelo='55', + xml=xml1 +) +``` Exemplo de uso da NFSe Paulistana --------------------------------- diff --git a/pytrustnfe/nfe/__init__.py b/pytrustnfe/nfe/__init__.py index 8395f24..1a5b9c0 100644 --- a/pytrustnfe/nfe/__init__.py +++ b/pytrustnfe/nfe/__init__.py @@ -214,6 +214,22 @@ def xml_consulta_distribuicao_nfe(certificado, **kwargs): # Assinar return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs) +def consulta_distribuicao_nfe(certificado, **kwargs): + if "xml" not in kwargs: + kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs) + return _send_v310(certificado, **kwargs) + + +def xml_download_nfe(certificado, **kwargs): # Assinar + return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs) + + +def download_nfe(certificado, **kwargs): + if "xml" not in kwargs: + kwargs['xml'] = xml_download_nfe(certificado, **kwargs) + return _send_v310(certificado, **kwargs) + + def _send_v310(certificado, **kwargs): xml_send = kwargs["xml"] base_url = localizar_url( @@ -243,19 +259,3 @@ def _send_v310(certificado, **kwargs): 'received_xml': response, 'object': obj.Body.nfeDistDFeInteresseResponse.nfeDistDFeInteresseResult } - - -def consulta_distribuicao_nfe(certificado, **kwargs): - if "xml" not in kwargs: - kwargs['xml'] = xml_consulta_distribuicao_nfe(certificado, **kwargs) - return _send_v310(certificado, **kwargs) - - -def xml_download_nfe(certificado, **kwargs): # Assinar - return _render(certificado, 'NFeDistribuicaoDFe', False, **kwargs) - - -def download_nfe(certificado, **kwargs): - if "xml" not in kwargs: - kwargs['xml'] = xml_download_nfe(certificado, **kwargs) - return _send_v310(certificado, **kwargs) diff --git a/pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml b/pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml index cd3fc38..9762e86 100644 --- a/pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml +++ b/pytrustnfe/nfe/templates/NFeDistribuicaoDFe.xml @@ -8,4 +8,7 @@ {{ chave_nfe }} + + {{ nsu }} + diff --git a/pytrustnfe/xml/schemas/distDFeInt_v1.01.xsd b/pytrustnfe/xml/schemas/distDFeInt_v1.01.xsd new file mode 100644 index 0000000..5497aa7 --- /dev/null +++ b/pytrustnfe/xml/schemas/distDFeInt_v1.01.xsd @@ -0,0 +1,297 @@ + + + + + Tipo número sequencial único + + + + + + + + Tipo quantidade de NSU + + + + + + + + + Tipo Versão dos leiautes do Web Service NFeDistribuicaoDFe + + + + + + + + + Tipo Ambiente + + + + + + + + + + Tipo Código da UF da tabela do IBGE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Código de orgão (UF da tabela do IBGE + 90 RFB) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Tipo Número do CNPJ + + + + + + + + + + Tipo Número do CPF + + + + + + + + + + Tipo Versão do Aplicativo + + + + + + + + + Tipo Código da Mensagem enviada + + + + + + + + + + Tipo Motivo + + + + + + + + + Tipo string genérico + + + + + + + + + Tipo Chave da Nota Fiscal Eletrônica + + + + + + + + + + Tipo Número do Protocolo de Status + + + + + + + + + + Data e Hora, formato UTC (AAAA-MM-DDThh:mm:ssTZD, onde TZD = +hh:mm ou -hh:mm) + + + + + + + + + Tipo Inscrição Estadual do Emitente // alterado EM 24/10/08 para aceitar ISENTO + + + + + + + + + + Tipo Decimal com 15 dígitos, sendo 13 de corpo e 2 decimais + + + + + + + + + Schema de pedido de distribuição de DF-e de interesse + + + + + + + Identificação do Ambiente: + 1 - Produção + 2 - Homologação + + + + + + Código da UF do Autor + + + + + + CNPJ do interessado no DF-e + + + + + CPF do interessado no DF-e + + + + + + + Grupo para distribuir DF-e de interesse + + + + + + Último NSU recebido pelo ator. Caso seja informado com zero, ou com um NSU muito antigo, a consulta retornará unicamente as informações resumidas e documentos fiscais eletrônicos que tenham sido recepcionados pelo Ambiente Nacional nos últimos 3 meses. + + + + + + + + Grupo para consultar um DF-e a partir de um NSU específico + + + + + + Número Sequencial Único. Geralmente esta consulta será utilizada quando identificado pelo interessado um NSU faltante. O Web Service retornará o documento ou informará que o NSU não existe no Ambiente Nacional. Assim, esta consulta fechará a lacuna do NSU identificado como faltante. + + + + + + + + Grupo para consultar uma NF-e a partir da chave de acesso + + + + + + Chave de acesso da NF-e a ser consultada + + + + + + + + + + + diff --git a/pytrustnfe/xml/validate.py b/pytrustnfe/xml/validate.py index 3f672ba..cf31e52 100644 --- a/pytrustnfe/xml/validate.py +++ b/pytrustnfe/xml/validate.py @@ -8,11 +8,12 @@ from lxml import etree PATH = os.path.dirname(os.path.abspath(__file__)) SCHEMA = os.path.join(PATH, 'schemas/enviNFe_v4.00.xsd') +SCHEMA_DFE = os.path.join(PATH, 'schemas/enviNFe_v4.00.xsd') -def valida_nfe(xml_nfe): +def valida_nfe(xml_nfe, schema=SCHEMA): nfe = etree.fromstring(xml_nfe) - esquema = etree.XMLSchema(etree.parse(SCHEMA)) + esquema = etree.XMLSchema(etree.parse(schema)) esquema.validate(nfe) erros = [x.message for x in esquema.error_log] return "\n".join(erros)