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)