PC SOFT
ONLINE REPOSITORY
FOR WINDEVWEBDEV AND WINDEV MOBILE

Home |  | Sign in | English US
[DLL Unimake.DFe] Como utilizar o serviço de download dos XML da NFe emitida contra o meu CNPJ (ex.: notas de compra)
Published by Wandrey
in the category Various
New features



Description
No 20º e 21º episódios do Wandrey Descomplica sobre a DLL Unimake.DFe, aprendemos:

- Consultar documentos fiscais eletrônicos (NFe) destinados;
- Como realizar a manifestação do destinatário para conseguir efetuar o download do XML da NFe.

A seguir, apresento o código em WINDEV para realizar as tarefas descritas acima.

Consultar documentos fiscais eletrônicos destinados:

```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"

nsu is string = "000000000000000"

WHEN EXCEPTION IN
LOOP
//Criar o XML
oDistDFeInt is Unimake.Business.DFe.XML.NFe.DistDFeInt
oDistDFeInt.Versao = "1.35"
oDistDFeInt.TpAmb = 1 //1=Homologação
oDistDFeInt.CNPJ = "06117473000150"
oDistDFeInt.CUFAutor = 41 //UFBrasil.PR

oDistNSU is Unimake.Business.DFe.XML.NFe.DistNSU
oDistNSU.UltNSU = nsu

oDistDFeInt.DistNSU = oDistNSU

//Consumir o serviço
oDistribuicaoDFe is Unimake.Business.DFe.Servicos.NFe.DistribuicaoDFe()
oDistribuicaoDFe.Executar(oDistDFeInt, oConfiguracao)

EDT_RetornoWSString = "XML Retornado:" + CR + CR
EDT_RetornoWSString += oDistribuicaoDFe.RetornoWSString + CR + CR

//Gravar o XML retornado da receita federal no HD
fDelete("d:\testenfe\RetornoDfe-" + nsu + ".xml")
fSaveText("d:\testenfe\RetornoDfe-" + nsu + ".xml", oDistribuicaoDFe.RetornoWSString)

IF oDistribuicaoDFe.Result.CStat = 138 //138=Documentos localizados
folder is string = "d:\testenfe\doczip"

//Salvar o XML retornados na consulta
//<param name="folder">Nome da pasta onde é para salvar os XML</param>
//<param name="saveXMLSummary">Salvar os arquivos de resumo da NFe e Eventos?</param>
//<param name="fileNameWithNSU">true=Salva os arquivos da NFe e seus eventos com o nsu no nome do arquivo / false=Salva os arquivos da NFe e seus eventos com o CHAVE da NFe no nome do arquivo</param>
oDistribuicaoDFe.GravarXMLDocZIP(folder, True, True)

//Como pegar o conteúdo retornado na consulta no formato string
FOR I = 1 TO oDistribuicaoDFe.Result.LoteDistDFeInt.GetDocZipCount()
oDocZip is Unimake.Business.DFe.XML.NFe.DocZip <- oDistribuicaoDFe.Result.LoteDistDFeInt.GetDocZip(I-1)

//Conteudo do XML retornado no formato string
EDT_RetornoWSString += "XML Retornado na consulta:"
EDT_RetornoWSString += oDocZip.ConteudoXML + CR + CR

cTipoXML is int = oDocZip.TipoXML

//Tipo do XML:
//1 = XML de resumo de eventos
//2 = XML de resumo da NFe
//3 = XML de distribuição de eventos da NFe (XML completo do evento)
//4 = XML de distribuição da NFe (XML completo da NFe)
//5 = XML de distribuição de eventos da CTe (XML completo do evento)
//6 = XML de distribuição do CTe (XML completo do CTe)
//0 = XML desconhecido
EDT_RetornoWSString += "TIPO XML: " + cTipoXML + CR + CR
END

//Como pegar os retornos dos resumos de eventos em objeto
EDT_RetornoWSString += "Resumos eventos:" + CR
FOR I = 1 TO oDistribuicaoDFe.GetResEventosCount()
oResEvento is Unimake.Business.DFe.XML.NFe.ResEvento <- oDistribuicaoDFe.GetResEvento(I-1)

EDT_RetornoWSString += oResEvento.ChNFe + CR
EDT_RetornoWSString += oResEvento.CNPJ + CR + CR
END

//Como pegar os retornos dos resumos de NFe em objeto
EDT_RetornoWSString += "Resumos NFe´s:" + CR
FOR I = 1 TO oDistribuicaoDFe.GetResNFeCount()
oResNFe is Unimake.Business.DFe.XML.NFe.ResNFe <- oDistribuicaoDFe.GetResNFe(I-1)

EDT_RetornoWSString += oResNFe.ChNFe + CR
EDT_RetornoWSString += oResNFe.CNPJ + CR + CR
EDT_RetornoWSString += oResNFe.VNF + CR
EDT_RetornoWSString += oResNFe.XNome + CR + CR
END

//Como pegar os retornos dos XML de Distribuição dos Eventos (XML completos dos eventos)
EDT_RetornoWSString += "Eventos NFe:" + CR
FOR I = 1 TO oDistribuicaoDFe.GetProcEventoNFesCount()
oProcEventoNFe is Unimake.Business.DFe.XML.NFe.ProcEventoNFe <- oDistribuicaoDFe.GetProcEventoNFes(I-1)

EDT_RetornoWSString += oProcEventoNFe.Evento.InfEvento.CNPJ + CR
EDT_RetornoWSString += oProcEventoNFe.Evento.InfEvento.ChNFe + CR + CR
END

//Como pegar os retornos dos XML de Distribuição das NFes (XML completos das NFes)
EDT_RetornoWSString += "NFe´s:" + CR
FOR I = 1 TO oDistribuicaoDFe.GetProcNFesCount()
oNfeProc is Unimake.Business.DFe.XML.NFe.NfeProc <- oDistribuicaoDFe.GetProcNFes(I-1)
oInfNFe is Unimake.Business.DFe.XML.NFe.InfNFe <- oNfeProc.NFe.GetInfNFe(0)

CUFInt is int = oInfNFe.Ide.CUF

EDT_RetornoWSString += oInfNFe.ID + CR
EDT_RetornoWSString += CUFInt + CR
EDT_RetornoWSString += oInfNFe.IDE.CNF + CR
EDT_RetornoWSString += oNfeProc.ProtNFe.InfProt.ChNFe + CR
EDT_RetornoWSString += oNfeProc.ProtNFe.InfProt.NProt + CR + CR
END

nsu = oDistribuicaoDFe.Result.UltNSU //Proximo NSU a ser consultado, não mude isso

IF oDistribuicaoDFe.Result.UltNSU = oDistribuicaoDFe.Result.MaxNSU
//Abandonar o LOOP e aguardar 1h10m para proxima consulta
BREAK
END
ELSE
IF oDistribuicaoDFe.Result.CStat = 656 //Consumo indevido
//Pausar consultas por 1h10m
nsu = oDistribuicaoDFe.Result.UltNSU //Proximo NSU a ser consultado, não mude isso
BREAK
ELSE
IF oDistribuicaoDFe.Result.CStat = 137 //Nenhum documento localizado
nsu = oDistribuicaoDFe.Result.UltNSU //Proximo NSU a ser consultado, não mude isso
BREAK
END
END
END
END

//Lembrar de salvar o conteúdo da variável "nsu" na base, pois ela vai ter o ultNSU retornado para ser consultado depois de 1h10m
DO
Info(ExceptionInfo(errFullDetails)) //Ele também pega o conteúdo da Exception do lado do C#, importante envolver o código em Try/Catch
END
```

Como realizar a manifestação do destinatário para conseguir efetuar o download do XML da NFe:

```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfiguracao is Unimake.Business.DFe.Servicos.Configuracao()
oConfiguracao.TipoDFe = TipoDFe.NFe
oConfiguracao.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfiguracao.CertificadoSenha = "12345678"

//Criar tag EnvEvento
oEnvEvento is Unimake.Business.DFe.XML.NFe.EnvEvento
oEnvEvento.Versao = "1.00"
oEnvEvento.IdLote = "000000000000001"

//Criar tag Evento
oEvento is Unimake.Business.DFe.XML.NFe.Evento
oEvento.Versao = "1.00"

//Criar tag DetEventoManif
oDetEventoManif is Unimake.Business.DFe.XML.NFe.DetEventoManif
oDetEventoManif.Versao = "1.00"
oDetEventoManif.DescEvento = "Ciencia da Operacao"
//oDetEventoManif.DescEvento = "Confirmacao da Operacao"

//Os dois tipos abaixo tem que ter a tag xJust
//oDetEventoManif.DescEvento = "Desconhecimento da Operacao"
//oDetEventoManif.DescEvento = "Operacao nao Realizada"
//oDetEventoManif.XJust = "Justificativa para manifestação da NFe de teste"

//Criar tag InfEvento
oInfEvento is Unimake.Business.DFe.XML.NFe.InfEvento

//Adicionar a tag DetEventoCanc dentro da Tag DetEvento
oInfEvento.DetEvento = oDetEventoManif

//Atualizar propriedades da oInfEvento
//IMPORTANTE: Atualização da propriedade TpEvento deve acontecer depois que o DetEvento recebeu o oDetEventoManif para que funcione sem erro
oInfEvento.COrgao = UFBrasil.AN //Manifestação tem que ser sempre 91 (ambiente nacional)
oInfEvento.ChNFe = "41191006117473000150550010000579281779843610"
oInfEvento.CNPJ = "06117473000150"
oInfEvento.DhEvento = SysDateTime()
oInfEvento.TpEvento = TipoEventoNFe.ManifestacaoCienciaOperacao
oInfEvento.NSeqEvento = 1
oInfEvento.VerEvento = "1.00"
oInfEvento.TpAmb = 2 //TipoAmbiente.Homologacao

//Adicionar a tag InfEvento dentro da tag Evento
oEvento.InfEvento = oInfEvento

//Adicionar a tag Evento dentro da tag EnvEvento
oEnvEvento.AddEvento(oEvento)

EDT_RetornoWSString = "Versao schema: " + oEnvEvento.Versao + CR
EDT_RetornoWSString += "LOTE: " + oEnvEvento.IdLote + CR
EDT_RetornoWSString += "Qtde eventos: " + oEnvEvento.GetEventoCount + CR + CR

WHEN EXCEPTION IN
//Consumir o serviço
oRecepcaoEvento is Unimake.Business.DFe.Servicos.NFe.RecepcaoEvento()
oRecepcaoEvento.Executar(oEnvEvento, oConfiguracao)

eventoAssinado is string = oRecepcaoEvento.GetConteudoXMLAssinado()
EDT_RetornoWSString += "XML Assinado: " + CR + eventoAssinado + CR + CR

// Gravar o XML assinado no HD
fDelete("d:\testenfe\ManifestacaoNFe.xml")
fSaveText("d:\testenfe\ManifestacaoNFe.xml", eventoAssinado)

//Ver retorno da SEFAZ
EDT_RetornoWSString += "XML Retornado: " + CR + oRecepcaoEvento.RetornoWSString + CR + CR

//Ver o conteúdo da tag CStat e XMotivo
EDT_RetornoWSString += "CStat do Lote Retornado: " + oRecepcaoEvento.Result.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRecepcaoEvento.Result.XMotivo + CR + CR

IF oRecepcaoEvento.Result.CStat = 128 //128 = Lote de evento processado com sucesso.
//Como pode existir vários eventos no XML (Caso da carta de correção que posso enviar várias sequencias de evento)
//é necessário fazer um loop para ver a autorização de cada um deles
FOR I = 1 TO oRecepcaoEvento.Result.GetRetEventoCount
oRetEvento is Unimake.Business.DFe.XML.NFe.RetEvento <- oRecepcaoEvento.Result.GetRetEvento(I - 1)

EDT_RetornoWSString += "CStat do evento " + I + ": " + oRetEvento.InfEvento.CStat + CR
EDT_RetornoWSString += "XMotivo: " + oRetEvento.InfEvento.XMotivo

SWITCH oRetEvento.InfEvento.CStat
CASE 135, 136, 155 // 135 = Evento homologado com vinculação da respectiva NFe
// 136 = Evento homologado sem vinculação com À respectiva NFe (SEFAZ não encontrou À NFe na base dela)
// 155 = Evento de Cancelamento homologado fora DO prazo permitido para cancelamento
// Grava o XML de distribuição
oRecepcaoEvento.GravarXmlDistribuicao("tmp\testenfe") // Grava o XML de distribuição

EDT_RetornoWSString += "String do XML de distribuição do evento " + I + ":" + CR + CR
EDT_RetornoWSString += oRecepcaoEvento.GetProcEventoNFeResultXMLByIndex(I) + CR + CR //String do XML de distribuição

OTHER CASE
// Evento rejeitado
// Realizar as ações necessárias
END
END
END
DO
Info(ExceptionInfo(errFullDetails)) //Ele também pega o conteúdo da Exception do lado do C#, importante envolver o código em Try/Catch
END
```

Para uma explicação mais detalhada do conteúdo deste post, confira os vídeos nos seguintes links:

Parte1:
https://www.youtube.com/watch?v=I-lSd0ZslVQ

Parte2:
https://www.youtube.com/watch?v=svgiZfxqdEc
Illustrations, screen shots
none
none
User reviews
(To evaluate this resource, click 'Write a review')
No review or comment? Be the first one!