12.8. Distribuição de DF-e [18-06-22]
12.8.1. Consulta DF-e emitidos para um interessado [12-08-22]
12.8. Distribuição de DF-e [18-06-22]
« Anterior
12.8.2. Consulta DF-e por NSU [12-08-22]
Próximo »

12.8.1. Consulta DF-e emitidos para um interessado [12-08-22]

Consultar as informações resumidas e documentos interesse da consulente a partir do NSU informado no parâmetro ultNSURecebido.

DICA

O uso adequado deste WS é suficiente para a obtenção de todos os Documentos Fiscais eletrônicos - DF-e que são disponibilizados pelo serviço inexistindo necessidade de uso do WS consulta por chave de acesso da NF-e (consChNFe) e do WS consulta por NSU (consNSU).

Assinatura

string distNSU(string siglaWS, int tipoAmbiente, string nomeCertificado, string versao, out string msgDados, out string msgRetWS, out int cStat, out string msgResultado, string CNPJ, string cUF, string ultNSURecebido, out string verAplic, out string dhResp, out string ultNSU, out string maxNSU, out int qtdeDocto, string proxy, string usuario, string senha, string licenca);

Descrição:

Consulta as informações resumidas e DF-e existentes para o interessesado a partir do NSU informado no parâmetro ultNSURecebido, o Web Service retorna até 50 informações resumidas e/ou documentos fiscais a partir do ultNSURecebido consultado.

ALERTA SOBRE O USO DA FUNCIONALIDADE

  • LIMITAÇÃO DE USO APÓS NT 2014.002 V1.12 de 09/03/2022

    A versão 1.12 da NT 2014.002 implementou regras de USO INDEVIDO dos serviços de download de NF-e.

    Veja o AVISO sobre a Atualização das regras de Uso do Web Service NFeDistribuiçãoDFe - NT 2014.002 para maiores detalhes das alterações.

  • Quantidade máxima de consulta por hora

    Quando inexistirem mais documentos disponíveis (cStat=137 ou ultNSU = maxNSU), a aplicação deve aguardar um hora para retomar a consulta. A persistência na consulta após receber o cStat=137 ou ultNSU = maxNSU provocará a rejeição "656 - Rejeicao: Consumo Indevido. Deve ser aguardado 1 hora para efetuar nova solicitação caso não existam mais documentos a serem pesquisados. Tente após 1 hora.

  • Consulta de NSU deve ser sequencial

    A consulta deve ser iniciada a partir de um NSU existente (pode ser informado zero quando não souber o primeiro NSU existente) e as consultas subsequentes devem ser a partir do ultNSU retornado até alcançar a condição ultNSU = maxNSU, a quebra da sequência de consulta provocará a rejeição "656 - Rejeicao: Consumo Indevido. Deve ser utilizado o ultNSU nas solicitacoes subsequentes. Tente apos 1 hora".

  • CONSUMO INDEVIDO - consequências

    A ocorrência da rejeição "656 - Rejeicao: Consumo indevido ... " provoca o BLOQUEIO do CNPJ/CPF do interessado por uma hora, impedindo a realização de consultas neste período.
    O desbloqueio é automático, mas é necessário aguardar o intervalo de tempo de uma hora, toda consulta realizada durante o período de bloqueio provoca o reínicio da contagem do tempo de bloqueio e pode provocar um loop infinito de consumo indevido no caso do usuário não aguardar o decurso do prazo de uma hora para realizar uma nova consulta.

IMPLEMENTAÇÃO

DICA DE IMPLEMENTAÇÃO

Se o ultNSU for menor que o maxNSU, o interesssado deve repetir a consulta atualizando o ultNSURecebido com o ultNSU devolvido pelo WS.

A forma adequada de implementar a consulta de documentos destinados é através de um serviço ou aplicativo que faz a consulta do WS a cada hora.

É necessário armazenar o último NSU obtido na consulta anterior, a aplicação deve efetuar a consulta do serviço enquanto o último NSU for menor que NSU máximo, ambas as informações são devolvidas pelo serviço.

 
 ultNSURecebido = ultNSUanterior
 ultNSu = 0
 maxNSU = 99999999
 cStat = 0
 txtRetorno =""
 
 enquanto ultNSU < maxNSU  ' IMPORTANTE, se ultNSU = maxNSU ==> FINALIZAR LOOP, POIS POIS NÃO EXISTE MAIS NSU,
                           ' continuar a chamada vai provocar CONSUMO INDEVIDO.

 
    txtRetorno = txtRetorno + distNSU(...., cStat, ..., ultNSURecebido, ultNSU, ... maxNSU, ...)
 
    se cStat <> 656
 
       ultNSURecebido = ultNSU  ' não atualizar quando ocorre consumo indevido, pois os retornos são zerados

    fim_se
 
fim_enquanto ' ultNSU < maxNSU

' tratar txtRetorno

se ultNSURecebido > ultNSUAnterior  
    ' significa que existem novos NSU
    ' tratar TXT de retorno da chamada, que retorna uma linha para cada NSU
    ' cada linha tem 3 informações separados por PIPE(|): NSU|tipo documento|XML

    Tratar TXT para extrair uma linha de cada vez, veja exemplo em VB 6.0 e Delphi que existe abaixo.    
 
    ' O tratamento deve extrair o NSU, tipoSchemaXML e XML
    '
    ' É recomendavel criar uma tabela para manter o NSU, tipoSchemaXML e XML, facilita a identificação do NSU
    ' recebidos e no caso de precisar processar novamente
    '

    inserir NSU, tipoSchemaXML e XML na tabela 
 
    ' Quando o ator for o destinatário, é necessário fazer a manifestação do destinatário para liberar o
    ' XML completo da NF-e.
    '
    se tipoSchemaXML = "resNFe_v1.01.xsd"
 
        ' extrarir chave de acesso da NF-e do XML
        ' fazer ciência da operação da NF-e para liberar o XML completo da NF-e, este XML deve aparecer
        ' nas próximas chamadas do distNSU

        fazer a ciência da operação do resumo da NF-e
 
    fim_se ' tipoSchemaXML

    ' tratar os demais tipoSchemaXML, os mais importantes são "procNFe_v4.00.xsd" => XML completo e o
    ' "resEvento_v1.01.xsd" que pode trazer informação de cancelamento da NF-e, CC-e, etc.

fim_se ' ultNSURecebido > ultNSUAnterior<br>

Parâmetros:

nome tipo fluxo descrição
siglaWS string entrada informar "AN" - o WS do Ambiente Nacional (AN) atende destinatário de qualquer UF.
tipoAmbiente inteiro entrada informar o código do ambiente desejado: 1- produção ou 2-homologação
NomeCertificado string entrada informar o certificado digital que será utilizado para assinatura:
1. informar o assunto do certificado digital que deve existir no repositório MY do current user, ex.: "CN=NFe - Associacao NF-e:99999090910270, C=BR, L=PORTO ALEGRE, O=Teste Projeto NFe RS, OU=Teste Projeto NFe RS, S=RS".
2. informar: ARQUIVO | [nome do arquivo pfx com caminho completo] | [senha do arquivo] para uso do certificado digital em arquivo pfx, ex.: "ARQUIVO|c:\certificado.pfx|senha".
3. informar: CERTIFICADO | [string base64 do arquivo pfx] | [senha do arquivo] no parâmetro NomeCertificado para passar uma string contendo um certificado digital em base64, ex.:"CERTIFICADO|MIIGoDCCBYigAwIBAgIQep(arquivo pfx do certificado digital convertido em base64...)QQDExNBQy|senha".
(novas opções)
versao string entrada informar a versão da mensagem do WS: 4.00
msgDados string saída retorna a mensagem XML enviada para o WS
msgRetWS string saída retorna a mensagem XML de resposta do WS
cStat inteiro saída retorna o resultado da chamada do WS
msgResultado string saída retorna a literal do resultado da chamada do WS
CNPJ string entrada informar o CNPJ ou CPF do ator que se deseja consultar os documentos fiscais. [26-08-18]
cUF string entrada informar o cUF
ultNSURecebido string entrada informar o NSU a partir do qual deseja realizar a consulta.Caso seja informado com zero, ou com um NSU muito antigo, a consulta retornará unicamente as notas fiscais que tenham sido recepcionadas nos últimos 3 meses.
verAplic string saída retorna a versão da aplicação do Web Service.
dhResp string saída retorna a Data e hora da mensagem de Resposta.
ultNSU string saída retorna o Último NSU pesquisado na Web Service. Se exisitrem mais NSU (maxNSU > ultNSU), o solicitante pode continuar a consulta a partir deste NSU para obter novos resultados.
maxNSU string saída retorna Maior NSU existente no Ambiente Nacional para o CNPJ/CPF informado.
qtdeDocto int saída retorna a quantidade de documentos devolvidos pelo WS.
proxy string entrada informar 'http://proxyserver:port' quando existir uso de proxy no ambiente. verificar com o cliente qual é o endereço do servidor proxy e a porta https, a porta padrão do https é 443, assim teríamos algo do tipo 'http://192.168.15.1:443'
usuario string entrada informar o usuário para autenticação no proxy, se necessário
senha string entrada informar a senha de autenticação no proxy, se necessário
licenca string entrada informar a chave da licenca de uso ou registro, esta funcionalidade pode ser utilizada sem qualquer restrição no ambiente de homologação. O uso em ambiente de produção requer o licenciamento, para maiores detalhes veja as condições de uso

Preenchimento da siglaWS

AN - O WS do Ambiente Nacional (AN) atende qualquer UF.

Preenchimento do nomeCertificado

informar o Nome do titular (campo Assunto) do certificado digital a ser utilizado na conexão SSL, formas possíveis:

1. uso de certificado digital existente no repositório MY do CSP do usuário corrente (currentuser)

É a forma de mais comum de uso, cabe ressaltar que é a única forma de uso de certificado digital do tipo A3 que a DLL oferece.
O usuário deve passar como parâmetro o campo assunto do certificado no parâmetro NomeCertificado para que a DLL localize um certificado digital com mesmo assunto no repositório MY do currentuser do equipamento.
Esta forma de uso requer a prévia instalação do certificado digital na conta do usuário do Windows (logon) que irá utilizar o certificado digital.

2. uso de certificado digital em arquivo no formato pfx

Permite o de uso de certificado digital em arquivo formato pfx.
O caminho da localização (path) do arquivo pfx deve ser passado para a DLL no formato: ARQUIVO | [nome do arquivo pfx com caminho completo] | [senha do arquivo] no parâmetro NomeCertificado, ex.: "ARQUIVO|c:\certificado.pfx|senha".
Esta opção só funciona com certificado digital do tipo A1.

3. uso de certificado digital em string base64

Permite uso o arquivo do certificado digital em formato pfx convertido em uma string base64. O certificado digital em string base64 deve ser passado para a DLL no formato: CERTIFICADO | [string base64 do arquivo pfx] | [senha do arquivo] no parâmetro NomeCertificado, ex.: "CERTIFICADO|MIIGoDCCBYigAwIBAgIQep(arquivo pfx do certificado digital convertido em base64...)QQDExNBQy|senha".
Esta opção só funciona com certificado digital do tipo A1. É uma opção de uso que oferece maior versatilidade, pois permite o armazenamento do certificado digital em banco de dados na aplicação. É a forma mais indicada para uso em ASP.NET.

Retorno:

A chamada devolve uma string com o resumo ou XML do documento consultado separados por quebra de linha.

O retorno é um TXT que tem uma linha para cada documento.

Cada linha tem 3 informações separadas por pipe (|):

NSU|tipo documento|XML

000000000004616|resNFe_v1.01.xsd |<resNFe versao="(...)>

000000000004617|resNFe_v1.01.xsd |<resNFe versao="(...)>

000000000004618|procNFe_v4.00.xsd |<nfeProc versao="(...)>

A parte inicial do texto é sempre posicional:

posições conteúdo
1 a 15 NSU
17 a 52 tipo do documento (schema XML)
54 a ... XML do documento

Exemplo de tratamento do TXT devolvido:

Visual Basic 6.0

 
Dim TXT As String
Dim linhas As Variant
Dim txtNSU As String
Dim txtSchema As String
Dim txtXML As String
Dim i As Integer
 
TXT = ""
 
'
'   TXT que retorna do distNSU
'
'  +---------+-------------------------------+
'  |posições |          conteúdo             |
'  +---------+-------------------------------+
'  |  1 a 15 | NSU                           |
'  | 17 a 52 | tipo do documento (schema XML)|
'  | 54 a ...| XML do documento              |
'  +---------+-------------------------------+
'
'  EXEMPLO DE TXT
'
'  ------NSU------+----------schema XML---------------+-------XML----
'  0........1......1..2.........3.........4.........5..5......6......
'  123456789012345678901234567890123456789012345678901234567890123456
'  000000000000364|resNFe_v1.01.xsd                   |<resNFe><chNFe>...</chNFe>...<cSitNFe>1</cSitNFe></resNFe>
'  000000000000365|resNFe_v1.01.xsd                   |<resNFe><chNFe>...</chNFe>...<cSitNFe>1</cSitNFe></resNFe>
'  000000000000366|procNFe_v4.00.xsd                  |<nfeProc><NFe>...</NFe><protNFe>...</protNFe></nfeProc>
'

TXT = TXT + "000000000000364|resNFe_v1.01.xsd                   |<resNFe><chNFe>...</chNFe>...<cSitNFe>1</cSitNFe></resNFe>" + Chr(13)
TXT = TXT + "000000000000365|resNFe_v1.01.xsd                   |<resNFe><chNFe>...</chNFe>...<cSitNFe>1</cSitNFe></resNFe>" + Chr(13)
TXT = TXT + "000000000000366|procNFe_v4.00.xsd                  |<nfeProc><NFe>...</NFe><protNFe>...</protNFe></nfeProc>" + Chr(13)
TXT = TXT + "000000000000367|procNFe_v4.00.xsd                  |<nfeProc><NFe>...</NFe><protNFe>...</protNFe></nfeProc>" + Chr(13)
TXT = TXT + "000000000000368|resEvento_v1.01.xsd                |<resEvento>...</resEvento>" + Chr(13)
 
'
' quebra o TXT no vetor linha, o delimitador da linha é caracter ASC=13
'

linhas = Split(TXT, Chr(13))
 
'
' laço para extrair o NSU, schemaXML e XML
'

For i = 0 To UBound(linhas) - 1  ' para OPTION BASE 0

    txtNSU = Left(linhas(i), 15)
    txtSchema = Trim(Mid(linhas(i), 17, 35))
    txtXML = Right(linhas(i), Len(linhas(i)) - 52)
 
    MsgBox "item[" + Str(i) + "]" + Chr(13) + "NSU   : " + txtNSU + Chr(13) + "Schema: " + txtSchema + Chr(13) + "XML   : " + txtXML
 
Next

Delphi

 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 
var
  i: integer;
  linha:TStringList;
  txtNFe: string;
  txtNSU: string;
  txtSchema: string;
  txtXML : string;
 
begin
 
    txtNFe := '';
    //
    //   TXT que retorna do distNSU
    //
    //  +---------+-------------------------------+
    //  |posições |          conteúdo             |
    //  +---------+-------------------------------+
    //  |  1 a 15 | NSU                           |
    //  | 17 a 52 | tipo do documento (schema XML)|
    //  | 54 a ...| XML do documento              |
    //  +---------+-------------------------------+
    //
    //  EXEMPLO DE TXT
    //
    //  ------NSU------+----------schema XML---------------+-------XML----
    //  0........1......1..2.........3.........4.........5..5......6......
    //  123456789012345678901234567890123456789012345678901234567890123456
    //  000000000000364|resNFe_v1.01.xsd                   |<resNFe><chNFe>...</chNFe>...<cSitNFe>1</cSitNFe></resNFe>
    //  000000000000365|resNFe_v1.01.xsd                   |<resNFe><chNFe>...</chNFe>...<cSitNFe>1</cSitNFe></resNFe>
    //  000000000000366|procNFe_v4.00.xsd                  |<nfeProc><NFe>...</NFe><protNFe>...</protNFe></nfeProc>
    //
 
    txtNFe := txtNFe + '000000000000364|resNFe_v1.01.xsd                   |<resNFe><chNFe>...</chNFe>...<cSitNFe>1</cSitNFe></resNFe>' + Chr(13);
    txtNFe := txtNFe + '000000000000365|resNFe_v1.01.xsd                   |<resNFe><chNFe>...</chNFe>...<cSitNFe>1</cSitNFe></resNFe>' + Chr(13);
    txtNFe := txtNFe + '000000000000366|procNFe_v4.00.xsd                  |<nfeProc><NFe>...</NFe><protNFe>...</protNFe></nfeProc>' + Chr(13);
    txtNFe := txtNFe + '000000000000367|procNFe_v4.00.xsd                  |<nfeProc><NFe>...</NFe><protNFe>...</protNFe></nfeProc>' + Chr(13);
    txtNFe := txtNFe + '000000000000368|resEvento_v1.01.xsd                |<resEvento>...</resEvento>' + Chr(13);
 
    //
    // quebra o TXT no vetor linha, o delimitador da linha é caracter ASC=13
    //
 
    linha := TStringList.Create;
    linha.Delimiter := chr(13);
    linha.Text := txtNFe;
 
    //
    // laço para extrair o NSU, schemaXML e XML
    //
 
    for i:=0 to linha.Count - 1 do
    begin
 
    txtNSU    := copy(linha[i],1,15);                     // posições:  1 a  15 - NSU
    txtSchema := copy(linha[i],17,35);                    // posições: 17 a  51 - SchemaXML
    txtXML    := copy(linha[i],53,length(linha[i])-52);   // posições: 53 a fim - XML
 
    MessageDlg('linha: ' + inttostr(i) + Chr(13)+'NSU: ' + txtNSU +Chr(13)+'Schema: ' + txtSchema +Chr(13)+'XML: ' + txtXML, mtInformation, [mbOk], 0);
 
    end;
 
end;
 
end.
12.8.1. Consulta DF-e emitidos para um interessado [12-08-22]
12.8. Distribuição de DF-e [18-06-22]
« Anterior
12.8. Distribuição de DF-e [18-06-22]
Próximo »
12.8.2. Consulta DF-e por NSU [12-08-22]