//PROCEDURE busca_manifestacoes(sRecebe_chave_nfe is string="")
// Status Nfe // btnNfeDistribuicaoDfe
s_recebe_thumprint_certificado is string = "" // vamos criar duas variaveis -
s_web_service is string = ""
IF RADIO_ambiente=1 THEN // se o ambiente for igual 1- Producao ou se for igual 2 - Homologaão
s_web_service="https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"
ELSE
s_web_service="https://hom.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx"
END
// vamos fazer sEnvelopE_soap
sUltnsu_15 is string = NumToString(EDT_UltNSU,"015d")
sXml_modelo is string=""
IF sRecebe_chave_nfe="" THEN
// vamos fazer a consulta por nsu
sXml_modelo=[
<distNSU>
<ultNSU>[%sUltnsu_15%]</ultNSU>
</distNSU>
]
ELSE
// vamos fazer a consulta por chave nfe
sXml_modelo=[
<consChNFe>
<chNFe>[%sRecebe_chave_nfe%]</chNFe>
</consChNFe>
]
END
sEnvelope_soap is string = [
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<nfeDistDFeInteresse xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NFeDistribuicaoDFe">
<nfeDadosMsg>
<distDFeInt xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
<tpAmb>[%RADIO_ambiente%]</tpAmb>
<CNPJ>[%EDT_Cnpj_cpf_dfe%]</CNPJ>
[%sXml_modelo%]
</distDFeInt>
</nfeDadosMsg>
</nfeDistDFeInteresse>
</soap12:Body>
</soap12:Envelope>
]
sEnvelope_soap = Replace(sEnvelope_soap,CR,"") // vamos tirar os cr da variavel senvelope_soap
EDT_ENVELOPE_SOAP_ENVIADO = sEnvelope_soap // vamos agora colocar o envelope soap no edt
// vamos ler o cadastro de empresas e pegar o certificado ja selecionado
HReadSeekFirst(empresa,empresaID,1)
IF HFound(empresa) THEN
s_recebe_thumprint_certificado=NoSpace(empresa.certificado_thumprint,sscAll)
Message("Procurando HttpCertificate ...")
ELSE
s_recebe_thumprint_certificado=""
END
HTTPCertificate(s_recebe_thumprint_certificado) // vamos ler o certificado com HTTPCertificate - e caso ele nao encontre nada, ele vai pedir para escolehr
HTTP.IgnoreError = httpIgnoreRevocation
HTTP.IgnoreError = httpErrorInvalidCertificate
HTTP.IgnoreError = httpErrorInvalidCertificateName
bMensagem is boolean=HTTPRequest(s_web_service,"","",sEnvelope_soap,"text/xml;charset=UTF-8","","")
HTTPCertificate("") //Vamos limpar da memoria o certificado
IF bMensagem=False THEN
Error(ErrorInfo(errFullDetails))
ELSE
EDT_RETORNO_SOAP = HTTPGetResult(httpResult)
EDT_Retorno_xml = XMLExtractString(EDT_RETORNO_SOAP,"nfeDistDFeInteresseResult")
EDT_TpAmb = XMLExtractString(EDT_Retorno_xml,"tpAmb")
EDT_Cstat = XMLExtractString(EDT_Retorno_xml,"cStat")
EDT_Xmotivo = XMLExtractString(EDT_Retorno_xml,"xMotivo")
EDT_dhResp = XMLExtractString(EDT_Retorno_xml,"dhResp")
EDT_UltNSU_retorno = XMLExtractString(EDT_Retorno_xml,"ultNSU")
EDT_maxNSU = XMLExtractString(EDT_Retorno_xml,"maxNSU")
// nesse momento ja temos o xml de retorno
sNome_tag is string = "" // nome_tag string - nUmero_nsu int - Vamos criar duas variaveis
nUmero_nsu is int = 0
bAchouxml is boolean = XMLDocument("xml_dfe",EDT_Retorno_xml) // vamos abrir o documento xml
XMLFind("xml_dfe",Null,XMLContinue+XMLChildItem)
WHILE XMLFound("xml_dfe") // vamos percorrer esse xml // WHILE XMLFound("XML_dfe")
sNome_tag = XMLElementName("xml_dfe") //vamos pegar o nome da tag -
IF sNome_tag="docZip" THEN // vamos verificar se a tag encontrada é doczip
bufFer_resumo is Buffer = XMLData("xml_dfe") // Vamos pegar o dado do resumo
bufFer_descompactar is Buffer = Decrypt(bufFer_resumo,"",compressNone,encodeBASE64) // Vamos comecar a descompatar
sDescompacta_xml is string = Uncompress(bufFer_descompactar) // vamos jogar numa string a descompactacao
XMLNext("xml_dfe") // agora vou para proxima tag pegar o numero do nsu
nUmero_nsu=XMLData("xml_dfe") // como eu sei que a proxima tag é o numero do nsu , vou pegar ele
sChnfe is string=XMLExtractString(sDescompacta_xml,"chNFe") // Vamos pegar a chave da nota no resumo
sNome_arquivo_gravar is string="c:\temp\resumo_nota_"+nUmero_nsu+".xml" // Criar as variaveis que vamos precisar
sNome_resumo is string=""
bTipo_xml_baixado is boolean=False
IF Contains(sDescompacta_xml,"resNFe")=True THEN // Verificar se retorno e´ resNFe
sNome_arquivo_gravar="C:\temp\"+"resNFe_"+nUmero_nsu+".xml"
sNome_resumo="resNFe"
END
// Verificar se retorno e´ nfeProc e protNfe,quer dizer xml baixado do sefaz
IF Contains(sDescompacta_xml,"nfeProc")=True AND Contains(sDescompacta_xml,"protNFe")=True THEN
sNome_arquivo_gravar = "C:\temp\"+sChnfe+"-procNFe.xml"
sNome_resumo = "nfeProc"
bTipo_xml_baixado=True
END
fSaveText(sNome_arquivo_gravar,sDescompacta_xml)
HReadSeekFirst(manifestacao_resumo,chNfe,sChnfe) // vamos verificar se essa chave existe no resumo
IF HFound(manifestacao_resumo) THEN
// se existir manifestacao vamos regravar
IF bTipo_xml_baixado=True THEN
manifestacao_resumo.xml_baixado=True
manifestacao_resumo.xml_baixado_documento=sDescompacta_xml
manifestacao_resumo.nsu_baixado=nUmero_nsu
HModify(manifestacao_resumo)
END
ELSE
// nao encontrou - ou nao existe - vamos gravar um novo resumo
HReset(manifestacao_resumo) // Mostrar na aula - faltou colocar hreset
manifestacao_resumo.nsu = nUmero_nsu
manifestacao_resumo.chNfe = sChnfe
move_dados()
IF bTipo_xml_baixado=True THEN
manifestacao_resumo.xml_baixado = True
manifestacao_resumo.xml_baixado_documento = sDescompacta_xml
manifestacao_resumo.nsu_baixado = nUmero_nsu
END
HAdd(manifestacao_resumo)
END
INTERNAL PROCEDURE move_dados()
manifestacao_resumo.xnome = XMLExtractString(sDescompacta_xml,"xNome")
manifestacao_resumo.ie = XMLExtractString(sDescompacta_xml,"IE")
manifestacao_resumo.tpNf = XMLExtractString(sDescompacta_xml,"tpNF")
manifestacao_resumo.digval = XMLExtractString(sDescompacta_xml,"digVal")
manifestacao_resumo.nProt = XMLExtractString(sDescompacta_xml,"nProt")
manifestacao_resumo.vnf = XMLExtractString(sDescompacta_xml,"vNF")
manifestacao_resumo.csitNfe = XMLExtractString(sDescompacta_xml,"cSitNFe")
manifestacao_resumo.cnpj = XMLExtractString(sDescompacta_xml,"CNPJ")
//<dhEmi>2021-07-14T12:43:48-03:00</dhEmi>
dAta is Date = ""
dhemissao_hora is string = XMLExtractString(sDescompacta_xml,"dhEmi")
dAta.Day = dhemissao_hora[[9 TO 10]]
dAta.Month = dhemissao_hora[[6 TO 7]]
dAta.Year = dhemissao_hora[[1 TO 4]]
hora is Time=""
hora.Hour = dhemissao_hora[[12 TO 13]]
hora.Minute = dhemissao_hora[[15 TO 16]]
hora.Second = dhemissao_hora[[18 TO 19]]
manifestacao_resumo.dhemi = dAta
manifestacao_resumo.hr_emissao = hora
dAta = ""
dhemissao_hora = XMLExtractString(sDescompacta_xml,"dhRecbto")
dAta.Day = dhemissao_hora[[9 TO 10]]
dAta.Month = dhemissao_hora[[6 TO 7]]
dAta.Year = dhemissao_hora[[1 TO 4]]
hora = ""
hora.Hour = dhemissao_hora[[12 TO 13]]
hora.Minute = dhemissao_hora[[15 TO 16]]
hora.Second = dhemissao_hora[[18 TO 19]]
manifestacao_resumo.dhrecbto = dAta
manifestacao_resumo.hora_recibo = hora
manifestacao_resumo.ciencia_cstat = ""
manifestacao_resumo.ciencia_motivo = ""
manifestacao_resumo.confirmado_cstat = ""
manifestacao_resumo.confirmado_motivo = ""
manifestacao_resumo.desconhecimento_Csat = ""
manifestacao_resumo.desconhecimento_motivo = ""
manifestacao_resumo.xml_baixado_documento = ""
manifestacao_resumo.soap_enviado = EDT_ENVELOPE_SOAP_ENVIADO
manifestacao_resumo.soap_retorno = EDT_RETORNO_SOAP
manifestacao_resumo.xml_retorno = EDT_Retorno_xml
END
END
// vamos ao final da pergunta, ir para outra tag
XMLNext("xml_dfe")
END
fSaveText("c:\temp\EDT_ENVELOPE_SOAP_ENVIADO.txt",EDT_ENVELOPE_SOAP_ENVIADO)
fSaveText("c:\temp\EDT_RETORNO_SOAP.txt",EDT_RETORNO_SOAP)
fSaveText("c:\temp\EDT_Retorno_xml.txt",EDT_Retorno_xml)
TableDisplay(TABLE_Manifestacao_resumo,taInit)
Info("Buscado Notas")
//xml_erro
//xml_dist_dfe --> proprio xml
// S_xml_nfe
// S_xml_evento
// Doczip
// Xml_arquivo
// Local_arquivo
// Xml_baixado boolean
END