No 11º episódio do Wandrey Descomplica sobre a DLL Unimake.DFe, aprendemos:
- Como validar XML dos Documentos Fiscais Eletrônicos (NFe, NFCe, CTe, etc.)
- Resolução de Problemas ao Enviar e Receber Retornos de NFe, NFCe, CTe, etc.
-- O que fazer quando não é possível obter o retorno após o envio de uma NFe, NFCe, CTe, MDFe, etc.
A seguir, apresento o código em WINDEV para realizar as tarefas descritas acima.
Como validar XML:
```
WHEN EXCEPTION IN
//-----------------------------------------------------
//Validar XML da ProcNFe - Sem falhas
//-----------------------------------------------------
schema is string = "NFe.procNFe_v4.00.xsd";
arquivoXML is string = "d:\testenfe\41220606117473000150550010000580071051443444-procnfe.xml"
targetNS is string = "http://www.portalfiscal.inf.br/nfe"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML da ProcNFe - Com falhas
//-----------------------------------------------------
schema = "NFe.procNFe_v4.00.xsd"
arquivoXML = "D:\testenfe\41220606117473000150550010000580071051443444_com_erros-procnfe.xml"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML da NFe
//-----------------------------------------------------
schema = "NFe.nfe_v4.00.xsd"
arquivoXML = "d:\testenfe\41220606117473000150550010000580071051443444-nfe.xml"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML da NFCe
//-----------------------------------------------------
schema = "NFe.nfe_v4.00.xsd"
arquivoXML = "D:\testenfe\41240206117473000150650300000000031293519211-nfe.xml"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML de consulta status da NFe
//-----------------------------------------------------
schema = "NFe.consStatServ_v4.00.xsd"
arquivoXML = "D:\testenfe\20100222T222310-ped-sta.xml"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML de CTe
//-----------------------------------------------------
schema = "CTe.cte_v4.00.xsd"
arquivoXML = "D:\testenfe\41201280568835000181570010000004881704185136-cte.xml"
targetNS = "http://www.portalfiscal.inf.br/cte"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML do ProcCTe
//-----------------------------------------------------
schema = "CTe.procCTe_v4.00.xsd"
arquivoXML = "D:\testenfe\41201280568835000181570010000004881704185136-procCTe.xml"
targetNS = "http://www.portalfiscal.inf.br/mdfe"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML de consulta status da CTe
//-----------------------------------------------------
schema = "CTe.consStatServCTe_v4.00.xsd"
arquivoXML = "D:\testenfe\20230515T164812-ped-sta.xml"
targetNS = "http://www.portalfiscal.inf.br/cte"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML do MDFe
//-----------------------------------------------------
schema = "MDFe.mdfe_v3.00.xsd"
arquivoXML = "D:\testenfe\41240306117473000150580010000008611017220672-mdfe.xml"
targetNS = "http://www.portalfiscal.inf.br/mdfe"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML do ProcMDFe
//-----------------------------------------------------
schema = "MDFe.procMDFe_v3.00.xsd"
arquivoXML = "D:\testenfe\41201280568835000181580010000010401406004659-procMDFe.xml"
targetNS = "http://www.portalfiscal.inf.br/mdfe"
ValidarXMLDFE(arquivoXML, schema, targetNS)
//-----------------------------------------------------
//Validar XML de consulta status da MDFe
//-----------------------------------------------------
schema = "MDFe.consStatServMDFe_v3.00.xsd"
arquivoXML = "D:\testenfe\20170210T100210-ped-sta.xml"
targetNS = "http://www.portalfiscal.inf.br/mdfe"
ValidarXMLDFE(arquivoXML, schema, targetNS)
DO
EDT_RetornoWSString += "Exceção: " + CR + errFullDetails
END
PROCEDURE PRIVATE ValidarXMLDFE(arquivoXML, schema, targetNS)
// Instanciar o objeto de validação do esquema
oValidarSchema is Unimake.Business.DFe.ValidarSchema()
// Validar o XML
oValidarSchema.Validar(arquivoXML, schema, targetNS)
// Atualizar a string de retorno com o resultado da validação
EDT_RetornoWSString += "Arquivo: " + CR + arquivoXML + CR + CR
IF NOT oValidarSchema.Success
EDT_RetornoWSString += "Status validação: " + CR + "Ocorreu erro da validação" + CR + CR
EDT_RetornoWSString += "Errorcode: " + CR + oValidarSchema.ErrorCode + CR + CR + "Message: " + CR + oValidarSchema.ErrorMessage + CR + CR
ELSE
EDT_RetornoWSString += "Status validação: " + CR + "XML validado com sucesso." + CR + CR
END
RETURN
```
O que fazer quando não é possível obter o retorno após o envio de uma NFe, NFCe, CTe, MDFe, etc.
Utilizei o código do envio de NFe Síncrono, que criamos em um episódio anterior do Wandrey Descomplica, e adaptei a consulta situação da NFe para finalizar a nota em caso de problemas, mas é fundamental que você veja o vídeo informado no final desta publicação para ter uma compreensão mais ampla da ideia, pois no código a seguir tem somente a parte da consulta situação e lá você verá o todo, com detalhes.
```
//Criar as configurações mínimas necessárias para consumir o serviço
oConfConsSitNFe is Unimake.Business.DFe.Servicos.Configuracao()
oConfConsSitNFe.TipoDFe = TipoDFe.NFe
oConfConsSitNFe.CertificadoArquivo = "C:\Projetos\certificados\UnimakePV.pfx"
oConfConsSitNFe.CertificadoSenha = "12345678"
//Criar tag ConsSitNFe
oConsSitNFe is Unimake.Business.DFe.XML.NFe.ConsSitNFe
oConsSitNFe.Versao = "4.00"
oConsSitNFe.TpAmb = TipoAmbiente.Homologacao
oConsSitNFe.ChNFe = chaveNFe
//Consumir o serviço
oConsultaProtocolo is Unimake.Business.DFe.Servicos.NFe.ConsultaProtocolo()
oConsultaProtocolo.Executar(oConsSitNFe, oConfConsSitNFe)
IF oConsultaProtocolo.Result.CStat = 100 //Nota autorizada
oAutorizacao.AddRetConsSitNFes(oConsultaProtocolo.Result)
//Gravar o XML de distribuição no HD
oAutorizacao.GravarXmlDistribuicao("d:\testenfe")
//Pegar a string do XML de distribuição para gravar na base de dados
docProcNFe is string = oAutorizacao.GetNFeProcResults(chaveNFe)
EDT_RetornoWSString += "XML de distribuição:" + CR + CR
EDT_RetornoWSString += docProcNFe + CR + CR
ELSE
//Alguma rejeição, fazer tratamentos
EDT_RetornoWSString += "Rejeição consulta protocolo:" + CR + CR
EDT_RetornoWSString += oConsultaProtocolo.Result.CStat + CR
EDT_RetornoWSString += oConsultaProtocolo.Result.XMotivo + CR + CR
END
```
Para uma explicação mais detalhada do conteúdo deste post, confira o vídeo no seguinte link:
https://www.youtube.com/watch?v=P37tVnal2kQ