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/Servidores.py b/pytrustnfe/Servidores.py
index bedbd1e..7482c6f 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',
@@ -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',
}
}
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/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 %}
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)
diff --git a/setup.py b/setup.py
index ef532c9..391fe2b 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@
from setuptools import setup, find_packages
-VERSION = "1.0.37"
+VERSION = "1.0.39"
setup(