ConsultarDistribuicaoDFe(aCodigoUF, aCNPJCPF : string; aNSU: string; aTipoNSU: TNSUKind)
Este método permite aos atores da NF-e (envolvidos na operação) o acesso aos documentos fiscais eletrônicos (DF-e) e informações resumidas que não tenham sido gerados por ele e que sejam de seu interesse.
O método ConsultarDistribuicaoDFe
Exemplo em VB
Private Sub btnConsultarDfe_Click()
If ((cbbUFConfig.Text <> "") And (txtCNPJConfig <> "") And (cbbCertificado.Text <> "")) Then
strngrdNotas.Text = ""
txtQtdNotas.Text = ""
' Inicia consulta com NSU = "000000000000000"
consultaDFe ("000000000000000")
Else
MsgBox "Campos Certificado ou UF ou CNPJ vazios!"
End If
End Sub
Private Sub consultaDFe(ultNSU As String)
Dim RetDFe, auxXML As String
Dim j, jx, i As Integer
Dim listaXML, nsu As Collection
Set nsu = New Collection
Set listaXML = New Collection
Dim lNodeList, iRSEmitente, iVNF, iSitManifestacao As IXMLDOMNodeList ' tipagem da MSXML6_TLB
' Função de "Consulta da Relação de Documentos a serem distribuidos para determinado CPF ou CNPJ de acordo com a NF-e"
' ConsultarDistribuicaoDFe(aCodigoUF, aCNPJCPF : string; aNSU: string; aTipoNSU: TNSUKind): string;
RetDFe = spdNFe.ConsultarDistribuicaoDFe(trataUF(cbbUFConfig.Text), spdNFe.CNPJ, ultNSU, nkUltimo)
' A função abaixo recebe o XML da consulta
configObjeto (RetDFe)
' Obtém o NSU mais alto e salva em maxNSU
Set lNodeList = lXMLDoc.selectNodes("//retDistDFeInt/maxNSU")
maxNSU = lNodeList.Item(0).Text
' Percorre os NSU e salva os números em nsu
Set lNodeList = lXMLDoc.selectNodes("//retDistDFeInt/loteDistDFeInt/docZip/@NSU")
If lNodeList.length > 0 Then
For i = 0 To lNodeList.length - 1
nsu.Add lNodeList.Item(i).Text
' Atualiza variável nroUltiNSU (último NSU) e nroIniNSU (valor inicial do NSU)
' Cada consulta retorna 50 ítens; ao final da Sub, esses valores serão usados para
' repetir a consulta até atingir o maxNSU
nroUltiNSU = lNodeList.Item(i).Text
nroIniNSU = lNodeList.Item(0).Text
If ultNSU = "000000000000000" Then
txtNSUInicial.Text = nroIniNSU
End If
Next i
End If
' Criando NodeList com XML compactado
Set lNodeList = lXMLDoc.selectNodes("//retDistDFeInt/loteDistDFeInt/docZip")
' Verifica se NodeList não está vazia
If (lNodeList.length > 0) Then
For i = 0 To lNodeList.length - 1
auxXML = lNodeList.Item(i).Text
' Descompacta cada XML e salva o na collection listaXML
listaXML.Add spdNFe.DescompactarXMLZip(auxXML)
Next
End If
' Conta o número de chaves para atualizar o contador
For jx = 1 To listaXML.Count
configObjeto (listaXML(jx))
' Criando NodeList com as chaves
Set lNodeList = lXMLDoc.selectNodes("//resNFe/chNFe")
' Verifica se NodeList está vazia
If lNodeList.length > 0 Then
For i = 0 To lNodeList.length - 1
QtdChaves = QtdChaves + 1
Next
End If
Next
' Atualiza o contador
txtQtdNotas.Text = Str(QtdChaves)
' Loop para carregar as chaves
For j = 1 To listaXML.Count
configObjeto (listaXML.Item(j))
' Selecionando chNFe, xNome e vNF para gerar o relatório
Set lNodeList = lXMLDoc.selectNodes("//resNFe/chNFe")
Set iRSEmitente = lXMLDoc.selectNodes("//resNFe/xNome")
Set iVNF = lXMLDoc.selectNodes("//resNFe/vNF")
' Verifica se NodeList não está vazia
If (lNodeList.length > 0) Then
' Preenche a lista com os resultados da pesquisa
For i = 0 To lNodeList.length - 1
strngrdNotas.Text = strngrdNotas.Text & vbCrLf _
& " * chNota = " & lNodeList.Item(i).Text & vbCrLf _
& " * NSU = " & nsu.Item(j) & vbCrLf _
& " * xNome = " & iRSEmitente.Item(i).Text & vbCrLf _
& " * vNF = " & iVNF.Item(i).Text & vbCrLf _
& "========================================================"
Next
End If
Next
' Implementação recursiva para fazer as consultas
' Caso esteja marcada a checkbox chkConsultaTotal
' Atualiza os campos de texto com valores inicial e final de NSU
txtNroUltiNSU.Text = nroUltiNSU
' Chama a Sub consultaDFe informando o último NSU consultado
' Na próxima consulta, SEFAZ envia a partir do próximo NSU
If (Val(nroUltiNSU) < Val(maxNSU)) And (chkConsultaTotal.Value) Then
consultaDFe nroUltiNSU
End If
End Sub
Sub configObjeto(XML As String)
' Configura objeto lXMLDoc
Set lXMLDoc = New DOMDocument60
lXMLDoc.setProperty "SelectionLanguage", "XPath"
lXMLDoc.async = False
If XML <> "" Then
lXMLDoc.loadXML RemoverNameSpaces(XML)
Else
MsgBox "XML não informado!"
End If
End Sub
Private Function RemoverNameSpaces(XMLString As String) As String
cRemoveNSTransform = "<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">" _
& "<xsl:output method=""xml"" indent=""no""/>" _
& "<xsl:template match=""/|comment()|processing-instruction()"">" _
& " <xsl:copy>" & " <xsl:apply-templates/>" & " </xsl:copy>" _
& "</xsl:template>" _
& "<xsl:template match=""*"">" & " <xsl:element name=""{local-name()}"">" _
& " <xsl:apply-templates select=""@*|node()""/>" & " </xsl:element>" _
& "</xsl:template>" _
& "<xsl:template match=""@*"">" & " <xsl:attribute name=""{local-name()}"">" _
& " <xsl:value-of select="".""/>" & " </xsl:attribute>" _
& "</xsl:template>" _
& "</xsl:stylesheet>"
Dim Doc, XSL As IXMLDOMDocument2
Dim Res As String
Dim p As Long
Set Doc = New DOMDocument60
Doc.async = False
Set XSL = New DOMDocument60
XSL.async = False
If Doc.loadXML(XMLString) Then
XSL.loadXML (cRemoveNSTransform)
Res = Doc.transformNode(XSL)
p = InStrRev(Res, "?>")
If p <> 0 Then
result = Mid(Res, p + 2)
End If
RemoverNameSpaces = result
Else
MsgBox "Ocorreu um erro!"
End If
End Function
Private Sub btnDescompactar_Click()
If strngrdNotas.Text <> "" Then
strngrdNotas.Text = spdNFe.DescompactarXMLZip(strngrdNotas.Text)
Else
MsgBox "Campo está vazio!"
End If
End Sub
Private Sub btnDownloadNFe_Click()
Dim chaveDownload, xmlCompactado As String
Dim localiza As Integer
chaveDownload = InputBox("Entre o valor da chave")
If chaveDownload <> "" Then
strngrdNotas.Text = ""
strngrdNotas.Text = spdNFe.ConsultarDistribuicaoDFeChave(trataUF(spdNFe.UF), spdNFe.CNPJ, chaveDownload)
' Limpa o retorno, deixando apenas o valor dentro da tag <docZip></docZip>
localiza = InStrRev(strngrdNotas.Text, ".xsd")
If localiza <> 0 Then
xmlCompactado = Mid(strngrdNotas.Text, localiza + 6)
strngrdNotas.Text = Replace(xmlCompactado, "</docZip></loteDistDFeInt></retDistDFeInt>", "")
' Aplica o método DescompactarXMLZip
strngrdNotas.Text = spdNFe.DescompactarXMLZip(strngrdNotas.Text)
End If
Else
MsgBox "Chave da nota não preenchida!"
End If
End Sub
Private Sub btnLoadConfig_Click()
'Arquivo INI a ser manipulado com parametrizações
spdNFe.ConfigINI = App.Path + "\nfeConfig.ini"
ArqIni = App.Path + "\nfeConfig.ini"
spdNFe.LoadConfig (ArqIni) 'Esse metodo faz com que o Componente carregue as configuracoes do INI para as devidas propriedades
' carregar valores
txtCNPJConfig.Text = spdNFe.CNPJ
cbbUFConfig.Text = spdNFe.UF
If spdNFe.NomeCertificado <> "" Then
cbbCertificado.List(0) = spdNFe.NomeCertificado
cbbCertificado.ListIndex = 0
End If
If rbHomologacao.Value = True Then
spdNFe.Ambiente = akHomologacao
Else
spdNFe.Ambiente = akProducao
End If
End Sub
Private Sub Command1_Click()
Form2.Show
End Sub
Private Sub Form_Initialize()
'Instancia o Objeto responsável pela interação com servidores da Receita'
Set spdNFe = New NFeX.spdNFeX
Set spdNFeDataSet = New NFeDataSetX.spdNFeDataSetX
' Método ConfigurarSoftwareHouse
' Método responsável por realizar a validação de licença com a Tecnospeed.
' Chamada : _spdNFeX.ConfigurarSoftwareHouse(aCnpjSH : String, aTokenSH : String)
' aCnpjSH : deve ser informado o CNPJ da Software House cliente Tecnospeed
' aTokenSH : deve ser informado o Token que a Software House possui junto a Tecnospeed
spdNFe.ConfigurarSoftwareHouse "08187168000160", "000000000000000000000"
'Utiliza Método do Componente para Listar Certificados instalado no SO
Dim i As Integer
Dim vetor As Variant
vetor = Split(spdNFe.ListarCertificados("|"), "|")
cbbCertificado.Clear
For i = LBound(vetor) To UBound(vetor)
cbbCertificado.AddItem vetor(i)
Next
End Sub
Exemplo em Delphi
Criando uma classe usando a OCX com todas as dependências necessárias
unit uConsultaDFe;
interface
uses
System.SysUtils,Classes,Vcl.Grids,
NFeX_TLB,MSXML6_TLB;
type
TConsultarDFE = class
private
spdNFeX: TspdNFeX;
function GetCodeUF(const aUF: String): String;
function RemoveNameSpaces(aXMLString: String): string;
public
constructor Create(const aCaminhoINI:string);
destructor destroy();
procedure ConsultaDFe(const aUF:WideString;const aCNPJ:WideString;const aNSU:WideString;astrngrdNotas:TStringGrid);
end;
implementation
{ TConsultarDFE }
constructor TConsultarDFE.Create(const aCaminhoINI:string);
begin
//Instancia o Objeto responsável pela interação com servidores da Receita'
spdNFeX := TspdNFeX.Create(nil);
//Esse metodo faz com que o Componente carregue as configuracoes do INI para as devidas propriedades
spdNFeX.LoadConfig(ACaminhoINI);
end;
procedure TConsultarDFE.ConsultaDFe(const aUF:WideString;const aCNPJ:WideString;const aNSU:WideString;aStrnGrdNotas:TStringGrid);
var
lXMLDoc: IXMLDOMDocument2;
procedure confgObject(XML: WideString);
begin
try
lXMLDoc := CoDOMDocument60.Create;
lXMLDoc.setProperty('SelectionLanguage', 'XPath');
if XML <> '' then
lXMLDoc.loadXML(RemoveNameSpaces(XML))
else
raise Exception.Create('XML não informado!');
except
on E: Exception do
Exception.Create(E.Message);
end;
end;
var
auxXML : Widestring;
i,j,jx : Integer;
listaXML, chaves : TStringList;
lNodeList, iRSEmitente, iVNF : IXMLDOMNodeList; //tipagem da MSXML6_TLB
qtdChaves, linhaGrid : Integer;
RetDFe :string;
begin
{Função de "Consulta da Relação de Documentos a serem distribuidos para determinado CPF ou CNPJ de acordo com a NF-e}
RetDFe := spdNFeX.ConsultarDistribuicaoDFe(GetCodeUF(aUF),aCNPJ,aNSU,nkUltimo);
aStrnGrdNotas.ColCount := 0;
aStrnGrdNotas.RowCount := 0;
aStrnGrdNotas.Cells[0, 0] := '';
if (RetDFe = EmptyStr) then
begin
raise Exception.Create('O Retorno DFe deve ser preenchid');
end
else
begin
try
listaXML := TStringList.Create;
chaves := TStringList.Create;
qtdChaves := 0;
confgObject(RetDFe);
//Criando NodeList com XML compactado
lNodeList := lXMLDoc.selectNodes('//retDistDFeInt/loteDistDFeInt/docZip');
//Verifica se o NodeList não está vazia, para evitar AV
if (lNodeList.length > 0) then
begin
for i := 0 to lNodeList.length - 1 do
begin
auxXML := lNodeList.item[i].text;
//Descompactando XML e adicionando a lista
listaXML.Add(spdNFeX.DescompactarXMLZip(auxXML));
end;
//contando Chaves
for jx := 0 to listaXML.Count - 1 do
begin
confgObject(listaXML.Strings[jx]);
//Criando NodeList com as chaves
lNodeList := lXMLDoc.selectNodes('//resNFe/chNFe');
if (lNodeList.length > 0) then
begin
for i := 0 to lNodeList.length - 1 do
begin
qtdChaves := qtdChaves + 1;
end;
end;
end;
//Montar Grid
with aStrnGrdNotas Do
begin
ColCount := 4;
RowCount := qtdChaves + 1;
Cells[0, 0] := 'Chave NF-e';
Cells[1, 0] := 'Emitente';
Cells[2, 0] := 'vNF (R$)';
Cells[3, 0] := 'XML';
aStrnGrdNotas.ColWidths[0] := 270;
aStrnGrdNotas.ColWidths[1] := 200;
aStrnGrdNotas.ColWidths[2] := 50;
aStrnGrdNotas.ColWidths[3] := 300;
end;
//Loop para carregar XML's da lista.
linhaGrid := 1;
for j := 0 to listaXML.Count - 1 do
begin
confgObject(listaXML.Strings[j]);
//Criando NodeList com as chaves
lNodeList := lXMLDoc.selectNodes('//resNFe/chNFe');
iRSEmitente := lXMLDoc.selectNodes('//resNFe/xNome');
iVNF := lXMLDoc.selectNodes('//resNFe/vNF');
if (lNodeList.length > 0) then
begin
for i := 0 to lNodeList.length - 1 do
begin
with aStrnGrdNotas do
begin
Cells[0, linhaGrid] := lNodeList.item[i].text;
Cells[1, linhaGrid] := iRSEmitente.item[i].text;
Cells[2, linhaGrid] := 'R$ ' + iVNF.item[i].text;
Cells[3, linhaGrid] := listaXML.Strings[j];
end;
linhaGrid := linhaGrid + 1;
end;
end;
end;
end;
finally
FreeAndNil(listaXML);
FreeAndNil(chaves);
end;
end;
end;
destructor TConsultarDFE.destroy;
begin
FreeAndNil(spdNFeX);
end;
function TConsultarDFE.GetCodeUF(Const aUF : String) : String;
var
_listUF : TStringList;
procedure PopulaListaUF;
begin
_listUF.Add('AC=12');
_listUF.Add('AL=27');
_listUF.Add('AP=16');
_listUF.Add('AM=13');
_listUF.Add('BA=29');
_listUF.Add('CE=23');
_listUF.Add('DF=53');
_listUF.Add('ES=32');
_listUF.Add('GO=52');
_listUF.Add('MA=21');
_listUF.Add('MT=51');
_listUF.Add('MS=50');
_listUF.Add('MG=31');
_listUF.Add('PA=15');
_listUF.Add('PB=25');
_listUF.Add('PR=41');
_listUF.Add('PE=26');
_listUF.Add('PI=22');
_listUF.Add('RJ=33');
_listUF.Add('RN=24');
_listUF.Add('RS=43');
_listUF.Add('RO=11');
_listUF.Add('RR=14');
_listUF.Add('SC=42');
_listUF.Add('SP=35');
_listUF.Add('SE=28');
_listUF.Add('TO=17');
_listUF.Add('AN=91');
end;
begin
_listUF := TStringList.Create;
Try
PopulaListaUF;
Result := _ListUF.Values[aUF];
Finally
_listUF.Free;
End;
end;
function TConsultarDFE.RemoveNameSpaces(aXMLString: String): string;
const
// An XSLT script for removing the namespaces from any document. It will remove the prefix as well.
// From http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl
cRemoveNSTransform =
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'
+ '<xsl:output method="xml" indent="no"/>' +
'<xsl:template match="/|comment()|processing-instruction()">' +
' <xsl:copy>' + ' <xsl:apply-templates/>' + ' </xsl:copy>' +
'</xsl:template>' +
'<xsl:template match="*">' + ' <xsl:element name="{local-name()}">' +
' <xsl:apply-templates select="@*|node()"/>' + ' </xsl:element>' +
'</xsl:template>' +
'<xsl:template match="@*">' + ' <xsl:attribute name="{local-name()}">' +
' <xsl:value-of select="."/>' + ' </xsl:attribute>' +
'</xsl:template>' +
'</xsl:stylesheet>';
var
Doc, XSL: IXMLDOMDocument2;
Res: string;
p: integer;
begin
Doc := CoDOMDocument60.Create;
Doc.ASync := false;
XSL := CoDOMDocument60.Create;
XSL.ASync := false;
try
Doc.loadXML(aXMLString);
XSL.loadXML(cRemoveNSTransform);
Res := Doc.TransFormNode(XSL);
// This now contains the original text with a prepended; remove it:
p := Pos('?>', Res);
result := Copy(Res, p + 2, Length(Res));
except
on E: Exception do
result := E.Message;
end
end;
end.
Usando a classe de exemplo feita em delphi
procedure TForm1.btnConsultaDestClick(Sender: TObject);
var
fConsulta: TConsultarDFE;
begin
fConsulta := TConsultarDFE.Create(ExtractFilePath(ParamStr(0)) + 'nfeConfig.ini');
try
fConsulta.ConsultaDFe('PR',
edtCpfCnpjDestinadas.Text,
'000000000000000',
strngrdNotas);
finally
FreeAndNil(fConsulta);
end;
Comentários
0 comentário
Por favor, entre para comentar.