Jump to content
Fivewin Brasil

Baixar Xml do Portal NF-e


aferra

Recommended Posts

A rotina estava funcionando muito bem, de repente não aparece mais o captcha. Antes porem, apacece a menssagem: 'Erro ao tentar obter CAPTCHA. Tente novamente!', 'Atenção!

Na função AtualizarImagem. (ALGUEM SABE PORQUE ESTA MENSAGEM?)

Link to comment
Share on other sites

  • 2 months later...

Pessoal, essa função é fantástica, gerei novas funcionalidades no meu sistema com ela. Entretanto, em algumas notas ela não trás os produtos, então, eu inclui a linha abaixo e corrigiu.

***************************************************
Static Function GeraBlocoDet( cParte )
   cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
   cParT_ := StrTran( cPar_, Chr( 160 ), "" )
   nIni := At( '<td class="fixo-prod-serv-numero"><span>1', cParT_ )
   nFim := At( '<td class="fixo-prod-serv-numero"><span>2', cParT_ ) - nIni
   IF nFim == 0
      cPar_ := SubStr( cParT_, nIni )
   ELSE
      cPar_ := SubStr( cParT_, nIni, nFim )
   ENDIF
   cPar_ := iif(Empty(cPar_), cParT_, cPar_) // Oscar 20/9/2017: Inclui essa linha porque em alguns casos não trazia os itens.

Coloquei aqui para, caso alguém tenha o mesmo problema.

Um abraço a todos, muito grato a quem disponibilizou essa função.

 

Link to comment
Share on other sites

Segue...

***************************************************
Function NFeBaixaXML( cNFeChave, cOpc, cFileName )
***************************************************
* Desenvolvido com base no projeto criado por Daniel Denobie - denobie@hotmail.com
* http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=16972
*  #include 'fivewin.ch'
   #include 'hbcompat.ch'
   DEFAULT cNFeChave := Space(44)
   DEFAULT cOpc      := ""
   DEFAULT cFileName := ""
   PRIVATE aCobr, I, cInfCpl, cInfAdFisco, cDigVal, cChave, cVerAplic, cTpAmb, c_Span, cRet
   PRIVATE cVersao, cArqXml, nArqHandle, cxMotivo, ccStat, cnProt, cPart_
   PRIVATE cDhRecbto, cTag, cTagPai, nIni, nFimTagPai, aTotais, cDiscAdicional, nContador
   PRIVATE P_, aDet, aPis, aTransp, aCofins, aIpi, lpOemTag, cTag_, aIcms, aTrib, nSoma
   PRIVATE aMedicamentos, aEmit, aDest, aIde, c_Tag, cPar_, nTamTag, cPar1_, nFim, cFile
   PRIVATE cParte, Contador, nTotPro, cHtml, cPart, cStringCookie, cViewState, cViewStateGenerator
   PRIVATE nFim3, cHiddenToken, nIni4, cHtml1, nFim4, Txt_File, cCodigo, ceEventValidation
   PRIVATE nIni1, nFim1, nIni2, nFim2, nIni3, cHiddenSom, cUrl, cUrl1, oServer, nInie, nFime, cUrl2
   PRIVATE cMsgErro
   Private cUrl := "http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8="
   Private cUrl1:= "http://www.nfe.fazenda.gov.br/portal/consultaCompleta.aspx?tipoConteudo=XbSeqxE8pl8="
   Private cUrl2:= 'http://www.nfe.fazenda.gov.br/portal/consultaCompleta.aspx?tipoConteudo=XbSeqxE8pl8%3d'
   Private cCaptcha, cCnpj, cStringCookie, cViewState, cEeventValidation, cHiddenToken, cCodigo, cViewStateGenerator
   Private cHiddenSom
   Private oChaveNFe_value:=cNFeChave,oTxt_captcha_value:=space(6)
   Private Button_1_enabled:=.f.,oImg_captcha,capt, oBt[2], lRet:=.F.
   define dialog principal resource "nfebxxml" title "(OASyS) Baixar XML do Site da SEFAZ"
   redefine get oChaveNFe var oChaveNFe_value                  id 101 of principal picture "@X!"
   redefine get capt      var oTxt_captcha_value               id 102 of principal picture "@X!"
   redefine image oImg_captcha                                 id 201 of principal ADJUST
   redefine button oBt[1] Prompt "&Alterar a imagem (CAPTCHA)" id 103 of principal action AtualizaImagem()
   oBt[1]:cToolTip:="Caso não consiga ver os caracteres da imagem, pressione esse botão para trocá-la."
   redefine button oBt[2] Prompt "&Consutar a chave"           id 100 of principal action (lRet:=continuar(oTxt_captcha_value, oChaveNFe_value, cOpc, @cFileName), iif(!lRet, (limpar(cNFeChave),atualizaimagem()), principal:End())) when Button_1_enabled
   oBt[2]:cToolTip:="Informe a chave e os caracteres do captcha, depois aperte esse botão para consultar e baixar o XML no site da SEFAZ."
   Activate dialog principal centered on init AtualizaImagem()
Return( lRet )
***************************************************
Static Function Limpar(cNFeChave)
   if !Empty(cNFeChave)
      oChaveNFe_Value:=cNFeChave
      oChaveNFe:refresh()
   endif
   oTxt_captcha_Value:=SPACE(6)
   capt:refresh()
   capt:setfocus()
Return Nil
***************************************************
Static Function AtualizaImagem2()
   Try
      oServer:= CreateObject( "MSXML2.ServerXMLHTTP.6.0")
   Catch
      MsgInfo('Erro na Criação do Serviço',"(OASyS) Baixa do XML")
      Return .f.
   End
   Try
      oServer:Open( "GET", cUrl, .f. )
      oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
      oServer:SetRequestHeader( "Connection", "keep-alive" )
      oServer:Send()
      oServer:WaitForResponse( 10000 )
   Catch
      MsgInfo('Erro na Conexão com o Site',"(OASyS) Baixa do XML")
      Return .f.
   End
   cHtml:= oServer:ResponseBody
   cStringCookie:= oServer:getResponseHeader("Set-Cookie")

   nInie   := At('id="ctl00_ContentPlaceHolder1_lblMensagemErro">',  cHtml) + 47
   If nInie > 47
      cHtml1  := SubStr( cHtml, nInie)
      nFime   := At('</span>', cHtml1) - 1
      cMsgErro:= SubStr(cHtml, nInie, nFime)
      If ! Empty(cMsgErro)
         MsgInfo(cMsgErro, 'Erro no Site ' + cUrl)
         Return .f.
      EndIf
   EndIf
   nIni  := At('id="__VIEWSTATE" value=',  cHtml) + 24
   cHtml1:= SubStr( cHtml, nIni)
   nFim  := At('" />', cHtml1) - 1
   cViewState:= SubStr(cHtml, nIni, nFim)

   nIni1 := At('id="__EVENTVALIDATION" value="',  cHtml) + 30
   cHtml1:= SubStr( cHtml, nIni1)
   nFim1 := At('" />', cHtml1) - 1
   cEeventValidation:= SubStr(cHtml, nIni1, nFim1)

   nIni2 := At('id="__VIEWSTATEGENERATOR" value="',  cHtml) + 33
   cHtml1:= SubStr( cHtml, nIni2)
   nFim2 := At('" />', cHtml1) - 1
   cViewStateGenerator:= SubStr(cHtml, nIni2, nFim2)

   nIni3 := At('id="ctl00_ContentPlaceHolder1_token" value="',  cHtml) + 44
   cHtml1:= SubStr( cHtml, nIni3)
   nFim3 := At('" />', cHtml1) - 1
   cHiddenToken:= SubStr(cHtml, nIni3, nFim3)

   nIni4 := At('id="ctl00_ContentPlaceHolder1_captchaSom" value="',  cHtml) + 49
   cHtml1:= SubStr( cHtml, nIni4)
   nFim4 := At('" />', cHtml1) - 1
   cHiddenSom:= SubStr(cHtml, nIni4, nFim4)

   nIni  := At('data:image/png;base64,',  cHtml) + 22
   cHtml1:= SubStr(cHtml, nIni)
   nFim  := At('" />', cHtml1) - 1

   txt_file:=fcreate("captcha.png", 0)
   If (!(ferror() = 0))
      MsgInfo("Erro de criacao do arquivo de imagem " + Str(ferror(), 3, 0),"(OASyS) Baixa do XML")
      Return .f.
   EndIf

   cCodigo:= SubStr(cHtml, nIni, nFim)
   If Empty(cCodigo)
      MsgInfo("Erro de criacao do arquivo de imagem","(OASyS) Baixa do XML")
      Return .f.
   EndIf

   cFile:= hb_base64Decode(cFile, cCodigo)
   FWrite(txt_file, cFile)
   FClose(txt_file)

   oImg_captcha:loadbmp("Captcha.png")
   oImg_captcha:refresh()

   if file("Captcha.png")
      Button_1_Enabled:=.T.
   else
      button_1_Enabled:=.F.
   endif
Return .t.
***************************************************
Static Function Continuar(cCaptcha, Chave, cOpc, cFileName)
   Local oInternet, cParm
   Default cOpc      := ""
   Default cFileName := ""
   lRet  := .F.
   cChave:= Chave
   if empty(Chave)
      msgalert(oemtoansi("A chave da NFe nÆo pode ser vazia !"),"(OASyS) Baixa do XML")
      return( lRet )
   endif
   if empty(cCaptcha)
      msgalert(oemtoansi("O captcha nÆo pode ser vazio !"),"(OASyS) Baixa do XML")
      return( lRet )
   endif
   If ! DigitoChave(cChave)
      return( lRet )
   EndIf
   cParm:= { { "__EVENTARGUMENT", "" },;
             { "__EVENTTARGET", "" },;
             { "__EVENTVALIDATION", cEeventValidation },;
             { "__VIEWSTATE", cviewState },;
             { "__VIEWSTATEGENERATOR", cViewStateGenerator },;
             { "ctl00$ContentPlaceHolder1$btnConsultar", "Continuar" },;
             { "ctl00$ContentPlaceHolder1$captchaSom", cHiddenSom},;
             { "ctl00$ContentPlaceHolder1$token", cHiddenToken },;
             { "ctl00$ContentPlaceHolder1$txtCaptcha", cCaptcha },;
             { "ctl00$ContentPlaceHolder1$txtChaveAcessoCompleta", cChave },;
             { "ctl00$txtPalavraChave", "" },;
             { "hiddenInputToUpdateATBuffer_CommonToolkitScripts", "1"}}
   Try
      oInternet:= TIPClientHTTP():New(cUrl, .f.)
   Catch
      MsgInfo('Erro na Criação do Serviço',"(OASyS) Baixa do XML")
      return( lRet )
   End
   oInternet:SetCookie(cStringCookie)
   If oInternet:Open()
      If oInternet:POST(cParm)
         cRet:= oInternet:ReadAll()
      Else
         MsgInfo('Erro no Post ' + cUrl, 'Aviso do Sistema')
         return( lRet )
      EndIf
   Else
      MsgInfo('Erro na Conexão',"(OASyS) Baixa do XML")
      return( lRet )
   EndIf
   oInternet:Close()
   If At('id="ctl00_ContentPlaceHolder1_bltMensagensErro" class="listaErro">', cRet) > 0
      cPart:= Substr(cRet, (At('id="ctl00_ContentPlaceHolder1_bltMensagensErro" class="listaErro">', cRet) + 66))
      cPart:= Substr(cPart, (At('<li>', cPart) + 4))
      MsgInfo(Troca_Acento(SubStr(cPart, 1, (At('</li>', cPart) - 1))),"(OASyS) Baixa do XML")
      return( lRet )
   EndIf
   Try
      oInternet:= TIPClientHTTP():New(cUrl1, .f.)
      oInternet:nConnTimeout:= 10000
   Catch
      MsgInfo('Erro na Criação do Serviço',"(OASyS) Baixa do XML")
      return( lRet )
   End
   oInternet:SetCookie(cStringCookie)
   If oInternet:Open()
      cHtml:= oInternet:ReadAll()
      cStringCookie:= oInternet:GetCookies()
   Else
      msgInfo('Erro na Conexão',"(OASyS) Baixa do XML")
      return( lRet )
   EndIf
   oInternet:Close()
   If At('id="ctl00_ContentPlaceHolder1_lblResultadoConsulta">', cHtml) > 0
      cPart:= Substr(cHtml, (At('id="ctl00_ContentPlaceHolder1_lblResultadoConsulta">', cHtml) + 52))
      MsgInfo(SubStr(cPart, 1, (At('</span>', cPart) - 1)),"(OASyS) Baixa do XML")
      return( lRet )
   EndIf
   If ! Empty(cHtml)
      nIni   := At('<html><link ',  cHtml)
      cParte := SubStr(cHtml, nIni)
      nIni   := At('<div id="ctl00_ContentPlaceHolder1_divBotoesConsulta"',  cParte)
      cParte := SubStr(cParte, 1, nIni - 1)
      nFim   := At('</form>', cParte)
      cFile  := SubStr(cParte, nFim)
      nIni   := RAt('fixo-prod-serv-numero',cFile)
      c_span := SubStr(cFile, nIni)
      nIni   := AT('<span>',c_span)+6
      nTamTag:= AT('</span>',c_span)-nIni
      nTotPro:= Val(AllTrim(SubStr(c_span,nIni,nTamTag)))
      If TratamentoDados()
         NFeGravaXML( cOpc, @cFileName )
         lRet := .T.
      Else
         MsgInfo('Erro no Tratamento do Dados',"(OASyS) Baixa do XML")
         return( lRet )
      EndIf
   Else
      msgInfo('Erro ao ler retorno da Consulta',"(OASyS) Baixa do XML")
      return( lRet )
   EndIf
Return( lRet )
***************************************************
Static Function TratamentoDados()
*Conteudo elementos da Matriz = {VALOR_TAG,TAG,TAG_PAI,Elemento_Final_TAG_PAI,LABEL_HTML,TAM_LABEL}
*TAM_LABEL se ZERO pega tudo, se MAIOR que ZERO pega o tamanho no início e se MENOR que ZERO exclui o tamanho no início e pega o restante
   (aIde:={}, aEmit:={}, aDest:={}, aDet:={}, aICMS:={}, aIPI:={}, aPIS:={}, aCOFINS:={}, aTotais:={}, aTransp:={}, aCobr:={})
   (aMedicamentos:= {}, aTrib:= {})

   AADD(aIde,{{"","cUF","ide",21,"Chave de Acesso",2},; //1- tratamento especial
              {"","cNF","",0,"Número",0},; //2- tratamento especial
              {"","natOp","",0,"Natureza da Operação",0},; //3-
              {"","indPag","",0,"Forma de Pagamento",1},; //4-
              {"","mod","",0,"Modelo",0},; //5-
              {"","serie","",0,"Série",0},; //6-
              {"","nNF","",0,"Número",0},; //7-
              {"","dhEmi","",0,"Data de Emissão",0},; //8- tratamento especial
              {"","dhSaiEnt","",0,"Entrada",0},; //9- tratamento especial
              {"","tpNF","",0,"Tipo da Operação",1},; //10-
              {"","idDest","",0,"Destino da operação",1},; //11-
              {"","cMunFG","",0,"Município da Ocorrência do Fato Gerador do ICMS",0},; //12-
              {"","tpImp","",0,"Formato de Impressão DANFE",1},; //13- tratamento especial
              {"","tpEmis","",0,"Tipo de Emissão",1},; //14-
              {"","cDV","",0,"Chave de Acesso",0},; //15- tratamento especial
              {"","tpAmb","",0,"Ambiente de autorização:",0},; //16- tratamento especial
              {"","finNFe","",0,"Finalidade",1},; //17-
              {"","indFinal","",0,"Consumidor final",1},; //18-
              {"","indPres","",0,"Presença do Comprador",1},; //19-
              {"","procEmi","",0,"Processo",1},; //20-
              {"","verProc","",0,"Versão do Processo",0}}) //21-

   AADD(aEmit,{{"","CNPJ","emit",20,"CNPJ",0},; //1- tratamento especial
               {"","CPF","",0,"CPF",0},; //2-
               {"","xNome","",0,"Nome / Razão Social",0},; //3-
               {"","xFant","",0,"Nome Fantasia",0},; //4-
               {"","xLgr","enderEmit",15,"Endereço",0},; //5- tratamento especial
               {"","nro","",0,"Endereço",0},; //6- tratamento especial
               {"","xCpl","",0,"Endereço",0},; //7- tratamento especial
               {"","xBairro","",0,"Bairro / Distrito",0},; //8-
               {"","cMun","",0,"Município",7},; //9-
               {"","xMun","",0,"Município",-10},; //10-
               {"","UF","",0,"UF",0},; //11-
               {"","CEP","",0,"CEP",0},; //12- tratamento especial
               {"","cPais","",0,"País",4},; //13-
               {"","xPais","",0,"País",-7},; //14-
               {"","fone","",0,"Telefone",0},; //15- tratamento especial
               {"","IE","",0,"Inscrição Estadual",0},; //16-
               {"","IEST","",0,"Inscrição Estadual do Substituto Tributário",0},; //17-
               {"","IM","",0,"Inscrição Municipal",0},; //18-
               {"","CNAE","",0,"CNAE Fiscal",0},; //19-
               {"","CRT","",0,"Código de Regime Tributário",1}}) //20-

   AADD(aDest,{{"","CNPJ","dest",20,"CNPJ",0},; //1-
               {"","CPF","",0,"CPF",0},; //2-
               {"","idEstrangeiro","",0,"",0},; //3-
               {"","xNome","",0,"Nome / Razão Social",0},; //4-
               {"","xLgr","enderDest",15,"Endereço",0},; //5- tratamento especial
               {"","nro","",0,"Endereço",0},; //6- tratamento especial
               {"","xCpl","",0,"Endereço",0},; //7- tratamento especial
               {"","xBairro","",0,"Bairro / Distrito",0},; //8-
               {"","cMun","",0,"Município",7},; //9-
               {"","xMun","",0,"Município",-10},; //10-
               {"","UF","",0,"UF",0},; //11-
               {"","CEP","",0,"CEP",0},; //12- tratamento especial
               {"","cPais","",0,"País",4},; //13-
               {"","xPais","",0,"País",-7},; //14-
               {"","fone","",0,"Telefone",0},; //15- tratamento especial
               {"","indIEDest","",0,"Indicador IE",2},; //16- tratamento especial
               {"","IE","",0,"Inscrição Estadual",0},; //17-
               {"","ISUF","",0,"Inscrição SUFRAMA",0},; //18-
               {"","IM","",0,"IM",0},; //19-
               {"","email","",0,"E-mail",0}}) //20-

*   Conteudo elementos da Matriz = {VALOR_TAG,TAG,LABEL_HTML}

   AADD(aTotais,{{"0.00","vBC","Base de Cálculo ICMS"},; //1-
                 {"0.00","vICMS","Valor do ICMS"},; //2-
                 {"0.00","vICMSDeson","Valor do ICMS Desonerado"},; //3-
                 {"0.00","vFCPUFDest","Valor Total ICMS FCP"},; //4-
                 {"0.00","vBCST","Base de Cálculo ICMS ST"},; //5-
                 {"0.00","vST","Valor ICMS Substituição"},; //6-
                 {"0.00","vProd","Valor Total dos Produtos"},; //7-
                 {"0.00","vFrete","Valor do Frete"},; //8-
                 {"0.00","vSeg","Valor do Seguro"},; //9-
                 {"0.00","vDesc","Valor Total dos Descontos"},; //10-
                 {"0.00","vII","Valor Total do II"},; //11-
                 {"0.00","vIPI","Valor Total do IPI"},; //12-
                 {"0.00","vPIS","Valor do PIS"},; //13-
                 {"0.00","vCOFINS","Valor da COFINS"},; //14-
                 {"0.00","vOutro","Outras Despesas Acessórias"},; //15-
                 {"0.00","vNF","Valor Total da NFe"}}) //16-

*   Conteudo elementos da Matriz = {VALOR_TAG,TAG,TAG_PAI,Elemento_Final_TAG_PAI,LABEL_HTML,TAM_LABEL}

   AADD(aTransp,{{"","modFrete","transp",17,"Modalidade do Frete",1},; //1-
                 {"","CNPJ","transporta",8,"CNPJ",0},; //2-
                 {"","CPF","",0,"CPF",0},; //3-
                 {"","xNome","",0,"Razão Social / Nome",0},; //4-
                 {"","IE","",0,"Inscrição Estadual",0},; //5-
                 {"","xEnder","",0,"Endereço Completo",0},; //6-
                 {"","xMun","",0,"Município",0},; //7-
                 {"","UF","",0,"UF",0},; //8-
                 {"",'placa','veicTransp',11,'Placa',0},; //9-
                 {"","UF","",0,"UF",0},; //10-
                 {"","RNTC","",0,"RNTC",0},; //11-
                 {"","qVol","vol",17,"Quantidade",0},; //12-
                 {"","esp","",0,"Espécie",0},; //13-
                 {"","marca","",0,"Marca dos Volumes",0},; //14-
                 {"","nVol","",0,"Volume",0},; //15-
                 {"","pesoL","",0,"Peso Líquido",0},; //16-
                 {"","pesoB","",0,"Peso Bruto",0}}) //17-

*   Conteudo elementos da Matriz = {VALOR_TAG,TAG}

   AADD(aCobr,{{"","nDup"},; //1-
               {"","dVenc"},; //2-
               {"","vDup"},; //3-
               {"","nDup"},; //4-
               {"","dVenc"},; //5-
               {"","vDup"},; //6-
               {"","nDup"},; //7-
               {"","dVenc"},; //8-
               {"","vDup"},; //9-
               {"","nDup"},; //10-
               {"","dVenc"},; //11-
               {"","vDup"},; //12-
               {"","nDup"},; //13-
               {"","dVenc"},; //14-
               {"","vDup"},; //15-
               {"","nDup"},; //16-
               {"","dVenc"},; //17-
               {"","vDup"},; //18-
               {"","nDup"},; //19-
               {"","dVenc"},; //20-
               {"","vDup"},; //21-
               {"","nDup"},; //22-
               {"","dVenc"},; //23-
               {"","vDup"},; //24-
               {"","nDup"},; //25-
               {"","dVenc"},; //26-
               {"","vDup"},; //27-
               {"","nDup"},; //28-
               {"","dVenc"},; //29-
               {"","vDup"}}) //30-

//    Conteudo elementos da Matriz = {VALOR_TAG,TAG,LABEL_HTML,TAM_LABEL}

      For p_:= 1 To nTotPro
        AADD(aDet,{{"","cProd","Código do Produto",0},; //1-
                   {"","cEAN","Código EAN Comercial",0},; //2-
                   {"","xProd","fixo-prod-serv-descricao",0},; //3-
                   {"","NCM","Código NCM",0},; //4-
                   {"","NVE","",0},; //5-
                   {"","CEST","Código CEST",0},; //6-
                   {"","EXTIPI","Código EX da TIPI",0},; //7-
                   {"","CFOP","CFOP",0},; //8-
                   {"","uCom","Unidade Comercial",0},; //9-
                   {"","qCom","Quantidade Comercial",0},; //10-
                   {"","vUnCom","Valor unitário de comercialização",0},; //11-
                   {"","vProd","fixo-prod-serv-vb",0},; //12-
                   {"","cEANTrib","Código EAN Tributável",0},; //13-
                   {"","uTrib","Unidade Tributável",0},; //14-
                   {"","qTrib","Quantidade Tributável",0},; //15-
                   {"","vUnTrib","Valor unitário de tributação",0},; //16-
                   {"","vFrete","Valor Total do Frete",0},; //17-
                   {"","vSeg","Valor do Seguro",0},; //18-
                   {"","vDesc","Valor do Desconto",0},; //19-
                   {"","vOutro","Outras Despesas Acessórias",0},; //20-
                   {"","indTot","Indicador de Composição do Valor Total da NF-e",1},; //21-
                   {"","nItemPed","Item do pedido de compra",0},; //22-
                   {"","xPed","Número do pedido de compra",0}}) //23-

         AADD(aTrib, {{"","vTotTrib","Valor Aproximado dos Tributos",0}}) //1-

         AADD(aMedicamentos, {{"","Lote",'Nro. do Lote', 0},; //1-
                             {"","qLote",'Quantidade de produtos no lote', 0},; //2-
                             {"","dFab",'Data de fabricaçã', 0},; //3-
                             {"","dVal",'Data de validade', 0},;  //4-
                             {"","vPMC",'Preço Máximo Consumido', 0},; //5-
                             {"","infAdProd",'Descrição', 0}}) //6-

         AADD(aICMS,{{"","orig","Origem da Mercadoria",1},; //1- ICMS Normal e  ST
                    {"","CST","Tributação do ICMS",2},; //2-
                    {"","CSOSN","Código de Situação da Operação",3},; //3-
                    {"","modBC","Modalidade Definição da",1},; //4-
                    {"","pRedBC","Percentual Redução",0},; //5-
                    {"","vBC","Base de Cálculo",0},; //6-
                    {"","pICMS","Alíquota do",0},; //7-
                    {"","vICMS","Valor do",0},; //8-
                    {"","vICMSDeson","",0},; //9-
                    {"","motDesICMS","",0},; //10-
                    {"","modBCST","Modalidade de determinação da BC do ICMS ST",1},; //11-
                    {"","pMVAST","Percentual Margem Valor Adicionado do ICMS ST",0},; //12-
                    {"","pRedBCST","Percentual da Redução de BC do ICMS ST",0},; //13-
                    {"","vBCST","Valor da BC do ICMS ST",0},; //14-
                    {"","pICMSST","Alíquota do imposto do ICMS ST",0},; //15-
                    {"","vICMSST","Valor do ICMS ST",0},; //16-
                    {"","vBCSTRet","Valor da BC do ICMS ST retido",0},; //17-
                    {"","vICMSSTRet","Valor do ICMS ST retido",0},; //18-
                    {"","vICMSOp","",0},; //19-
                    {"","pDif","",0},; //20-
                    {"","vICMSDif","",0},; //21-
                    {"","pCredSN","Alíquota aplicável de cálculo do crédito",0},; //22-
                    {"","vCredICMSSN","Valor de crédito do ICMS",0}}) //23-

         AADD(aIPI,{{"","cEnq","Código de Enquadramento", 3},;
                   {"","CST","CST", 2},; //1-
                   {"","vBC","Base de Cálculo", 0},; //2-
                   {"","pIPI","Alíquota", 0},; //3-
                   {"","vIPI","Valor IPI", 0},; //4-
                   {"","qBCProd","", 0},; //5-
                   {"","vAliqProd","", 0}}) //6-

         AADD(aPIS,{{"","CST","CST", 2},; //1-
                   {"","vBC","Base de Cálculo", 0},; //2-
                   {"","pPIS","Alíquota", 0},; //3-
                   {"","vPIS","Valor", 0},; //4-
                   {"","qBCProd","", 0},; //5-
                   {"","vAliqProd","", 0}}) //6-

         AADD(aCOFINS,{{"","CST","CST",2},; //1-
                      {"","vBC","Base de Cálculo",0},; //2-vBC
                      {"","pCOFINS","Alíquota",0},; //3-
                      {"","vCOFINS","Valor",0},; //4-
                      {"","qBCProd","",0},; //5-
                      {"","vAliqProd","",0}}) //6-
      Next p_

      nIni  := At('<div class="GeralXslt"',cFile)
      cParte:= SubStr(cFile, nIni)
      nIni  := At('<div id="Emitente"',cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //ide
      GeraBlocoIde(cParte)

      nIni  := At('<div id="Emitente"',cFile)
      cParte:= SubStr(cFile, nIni)
      nIni  := At('</div>',cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //emit
      GeraBlocoEmit(cParte)

      nIni  := At('<div id="DestRem"',cFile)
      cParte:= SubStr(cFile, nIni)
      nIni  := At('</div>',cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //dest
      GeraBlocoDest(cParte)

      nIni  := At('<td class="fixo-prod-serv-numero"><span>', cFile)
      cParte:= SubStr(cFile, nIni)
      nIni  := At('</body></html>', cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //det
      GeraBlocoDet(cParte)

      nIni  := At('<legend class="titulo-aba">Totais</legend>',cFile)
      cParte:= SubStr(cFile, nIni+42)
      nIni  := At('<div id="aba_nft_5"',cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //totais
      GeraBlocoTotais(cParte)

      nIni  := At('Dados do Transporte</legend>',cFile)
      cParte:= SubStr(cFile, nIni+29)
      nIni  := At('<div id="Cobranca"',cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //transp
      GeraBlocoTransp(cParte)

      nIni  := At('<legend>Duplicatas</legend><table',cFile)
      If nIni > 0
        cParte:= SubStr(cFile, nIni)
                nIni  := At('</table>', cParte)
              cParte:= SubStr(cParte, 1, nIni - 1)  //cobr
           GeraBlocoCobr(cParte)
      EndIf
Return .t.
***************************************************
Static Function GeraBlocoIde( cParte )
   (ctpAmb:="", cverAplic:="", cdhRecbto:="", cnProt:="", cdigVal:="", ccStat:="", cxMotivo:="")
   (cinfCpl:="", cinfAdFisco:="", cDiscAdicional:="")

   cPar_ := StrTran( cFile, Chr( 13 ) + Chr( 10 ), "" )
   cPar_ := StrTran( cPar_, Chr( 160 ), "" )
   nIni := At( '<legend>Informações Complementares de Interesse do Contribuinte</legend>', cPar_ )
   IF nIni > 0
      c_span := SubStr( cPar_, nIni + 70 )
      nIni   := At( '<div style="word-wrap: break-word">', c_span )
      c_span := SubStr( c_span, nIni + 35 )
      nIni   := At( '</div></span>', c_span )
      cinfCpl := AllTrim( SubStr( c_span, 1, nIni - 1 ) )
   ENDIF
   cPar_   := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
   cPar_   := StrTran( cPar_, Chr( 160 ), "" )
   nIni    := At( 'Situação Atual:', cPar_ )
   c_span  := SubStr( cPar_, nIni + 15 )
   nIni    := At( '(Ambiente de autorização:', c_span )
   cxMotivo := AllTrim( SubStr( c_span, 1, nIni - 1 ) )
   IF "AUTORIZADA" $ cxMotivo
      ccStat  := "100"
      cxMotivo := "Autorizado o uso da NF-e"
   ENDIF
   IF "CANCELADA" $ cxMotivo
      ccStat  := "101"
      cxMotivo := "Cancelamento de NF-e homologado"
   ENDIF
   nIni     := At( 'Data Inclusão AN</label></td></tr><tr><td><span>', cPar_ )
   c_span   := SubStr( cPar_, nIni + 50 )
   nIni     := At( '<span>', c_span ) + 6
   nTamTag  := At( '<input', c_span ) - nIni
   cnProt   := AllTrim( SubStr( c_span, nIni, nTamTag ) )
   c_span   := SubStr( c_span, nIni + nTamTag )
   nIni     := At( '<span>', c_span ) + 6
   c_span   := SubStr( c_span, nIni )
   nTamTag  := At( '</span>', c_span ) -1  // nIni
   cdhRecbto := AllTrim( SubStr( c_span, 1, nTamTag ) )
   cdhRecbto := SubStr( cdhRecbto, 7, 4 ) + "-" + SubStr( cdhRecbto, 4, 2 ) + "-" + Left( cdhRecbto, 2 ) + "T" + Right( cdhRecbto, 14 )
   nIni     := At( '<i>Digest</i> Value da NF-e', cPar_ )
   c_span   := SubStr( cPar_, nIni + 20 )
   nIni     := At( '<span>', c_span ) + 6
   nTamTag  := At( '</span>', c_span ) - nIni
   cdigVal  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
   nIni     := At( 'Versão XML', cParte )
   c_span   := SubStr( cParte, nIni )
   nIni     := At( '<span>', c_span ) + 6
   nTamTag  := At( '</span>', c_span ) - nIni
   cVersao  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
   FOR i := 1 TO Len( aIde[ 1 ] )
      cPar_ := cParte
      IF i == 12
         cPar_ := cFile
      ENDIF
      IF i == 13
         cPar_ := cFile
      ENDIF
      nIni  := At( aIde[ 1, i, 5 ], cPar_ )
      c_span := SubStr( cPar_, nIni )
      IF i != 16
         nIni   := At( '<span>', c_span ) + 6
         nTamTag := At( '</span>', c_span ) - nIni
         c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
      ELSE
         nIni := At( '</legend>', c_span )
         c_tag := AllTrim( SubStr( c_span, 1, nIni - 1 ) )
         IF At( 'produção', c_tag ) > 0
            c_tag := "1"
         ELSE
            c_tag := "2"
         ENDIF
         ctpAmb := c_tag
      ENDIF
      IF i == 2
         c_tag := SubStr( cChave, 36, 8 )
      ENDIF
      IF i == 8 .OR. i == 9
         IF !Empt( c_tag )
            c_tag := SubStr( c_tag, 7, 4 ) + "-" + SubStr( c_tag, 4, 2 ) + "-" + Left( c_tag, 2 ) + "T" + SubStr( c_tag, 12 )
         ENDIF
      ENDIF
      IF i == 15
         c_tag := Right( c_tag, 1 )
      ENDIF
      IF aIde[ 1, i, 6 ] != 0
         IF aIde[ 1, i, 6 ] > 0
            c_tag := Left( c_tag, aIde[ 1, i, 6 ] )
         ELSE
            c_tag := SubStr( c_tag, Abs( aIde[ 1, i, 6 ] ) + 1 )
         ENDIF
      ENDIF
      aIde[ 1, i, 1 ] := c_tag
      IF i == 21
         cverAplic := c_tag
      ENDIF
   NEXT i
RETURN NIL
***************************************************
Static Function GeraBlocoEmit( cParte )
   FOR i := 1 TO Len( aEmit[ 1 ] )
      cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
      cPar_ := StrTran( cPar_, Chr( 160 ), "" )
      nIni := At( aEmit[ 1, i, 5 ], cPar_ )
      IF nIni > 0
         c_span := SubStr( cPar_, nIni )
         nIni   := At( '<span>', c_span ) + 6
         nTamTag := At( '</span>', c_span ) - nIni
         c_tag := AllTrim( SubStr( c_span, nIni, nTamTag ) )
         IF i >= 1 .AND. i <= 2
            c_tag := StrTran( c_tag, ".", "" )
            c_tag := StrTran( c_tag, "/", "" )
            c_tag := StrTran( c_tag, "-", "" )
         ENDIF
         IF i >= 5 .AND. i <= 7
            nIni := At( ",,", c_tag )
            IF nIni == 0
               nIni := At( ",", c_tag )
            ENDIF
            IF i == 5
               c_tag := Left( c_tag, nIni - 1 )  // xlg
            ELSEIF i == 6
               c_tag := AllTrim( SubStr( c_tag, nIni + 2 ) )
               nIni := At( " ", c_tag )
               IF nIni > 0
                  c_tag := Left( c_tag, nIni - 1 ) // nro
               ENDIF
            ELSE
               c_tag := AllTrim( SubStr( c_tag, nIni + 2 ) )
               nIni := At( " ", c_tag )
               IF nIni > 0
                  c_tag := AllTrim( SubStr( c_tag, nIni + 1 ) ) // xcpl
               ELSE
                  c_tag := ""
               ENDIF
            ENDIF
         ENDIF
         IF i == 12
            c_tag := StrTran( c_tag, "-", "" )
         ENDIF
         IF i == 15
            c_tag := StrTran( c_tag, "(", "" )
            c_tag := StrTran( c_tag, ")", "" )
            c_tag := StrTran( c_tag, "-", "" )
         ENDIF
         IF aEmit[ 1, i, 6 ] != 0
            IF aEmit[ 1, i, 6 ] > 0
               c_tag := Left( c_tag, aEmit[ 1, i, 6 ] )
            ELSE
               c_tag := AllTrim( SubStr( c_tag, Abs( aEmit[ 1, i, 6 ] ) + 1 ) )
               c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
            ENDIF
         ENDIF
         aEmit[ 1, i, 1 ] := c_tag
      ENDIF
   NEXT i
RETURN NIL
***************************************************
Static Function GeraBlocoDest( cParte )
   FOR i := 1 TO Len( aDest[ 1 ] )
      cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
      cPar_ := StrTran( cPar_, Chr( 160 ), "" )
      nIni := At( aDest[ 1, i, 5 ], cPar_ )
      IF nIni > 0
         c_span := SubStr( cPar_, nIni )
         nIni   := At( '<span>', c_span ) + 6
         nTamTag := At( '</span>', c_span ) -nIni
         c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
         IF i >= 1 .AND. i <= 2
            c_tag := StrTran( c_tag, ".", "" )
            c_tag := StrTran( c_tag, "/", "" )
            c_tag := StrTran( c_tag, "-", "" )
         ENDIF
         IF i >= 5 .AND. i <= 7
            nIni := At( ",,", c_tag )
            IF nIni == 0
               nIni := At( ",", c_tag )
            ENDIF
            IF i == 5
               c_tag := Left( c_tag, nIni - 1 )
            ELSEIF i == 6
               c_tag := AllTrim( SubStr( c_tag, nIni + 2 ) )
               nIni := At( " ", c_tag )
               IF nIni > 0
                  c_tag := Left( c_tag, nIni - 1 )
               ENDIF
            ELSE
               c_tag := AllTrim( SubStr( c_tag, nIni + 2 ) )
               nIni := At( " ", c_tag )
               IF nIni > 0
                  c_tag := AllTrim( SubStr( c_tag, nIni + 1 ) )
               ELSE
                  c_tag := ""
               ENDIF
            ENDIF
         ENDIF
         IF i == 12
            c_tag := StrTran( c_tag, "-", "" )
         ENDIF
         IF i == 15
            c_tag := StrTran( c_tag, "(", "" )
            c_tag := StrTran( c_tag, ")", "" )
            c_tag := StrTran( c_tag, "-", "" )
         ENDIF
         IF i == 16
            c_tag := AllTrim( Str( Val( c_tag ) ) )
         ENDIF
         IF aDest[ 1, i, 6 ] != 0
            IF aDest[ 1, i, 6 ] > 0
               c_tag := Left( c_tag, aDest[ 1, i, 6 ] )
            ELSE
               c_tag := AllTrim( SubStr( c_tag, Abs( aDest[ 1, i, 6 ] ) + 1 ) )
               c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
            ENDIF
         ENDIF
         aDest[ 1, i, 1 ] := c_tag
      ENDIF
   NEXT i
RETURN NIL
***************************************************
Static Function GeraBlocoDet( cParte )
   cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
   cParT_ := StrTran( cPar_, Chr( 160 ), "" )
   nIni := At( '<td class="fixo-prod-serv-numero"><span>1', cParT_ )
   nFim := At( '<td class="fixo-prod-serv-numero"><span>2', cParT_ ) - nIni
   IF nFim == 0
      cPar_ := SubStr( cParT_, nIni )
   ELSE
      cPar_ := SubStr( cParT_, nIni, nFim )
   ENDIF
   cPar_ := iif(Empty(cPar_), cParT_, cPar_) // Oscar 20/9/2017: Inclui essa linha porque em alguns casos não trazia os itens.
   FOR p_ := 1 TO Len( aDet )
      FOR i := 1 TO Len( aDet[ p_ ] )
         nIni := At( aDet[ p_, i, 3 ], cPar_ )
         IF nIni > 0
            c_span := SubStr( cPar_, nIni )
            nIni   := At( '<span>', c_span ) + 6
            nTamTag := At( '</span>', c_span ) -nIni
            c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
            IF aDet[ p_, i, 4 ] != 0
               IF aDet[ p_, i, 4 ] > 0
                  c_tag := Left( c_tag, aDet[ p_, i, 4 ] )
               ELSE
                  c_tag := AllTrim( SubStr( c_tag, Abs( aDet[ p_, i, 4 ] ) + 1 ) )
                  c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
               ENDIF
            ENDIF
            IF i != 3 .AND. i != 1
               c_tag := StrTran( c_tag, ".",  "" )
               c_tag := StrTran( c_tag, ",", "." )
            ENDIF
            aDet[ p_, i, 1 ] := c_tag
         ENDIF
      NEXT p_

      //Tags Valor dos tributos pagos
      FOR i := 1 TO Len( aTrib[ p_ ] )
         nIni := At( aTrib[ p_, i, 3 ], cPar_ )
         IF nIni > 0
            c_span := SubStr( cPar_, nIni )
            nIni   := At( '<span>', c_span ) + 6
            nTamTag := At( '</span>', c_span ) - nIni
            c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
            IF aTrib[ p_, i, 4 ] != 0
               IF aTrib[ p_, i, 4 ] > 0
                  c_tag := Left( c_tag, aTrib[ p_, i, 4 ] )
               ELSE
                  c_tag := AllTrim( SubStr( c_tag, Abs( aTrib[ p_, i, 4 ] ) + 1 ) )
                  c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
               ENDIF
            ENDIF
            c_tag := StrTran( c_tag, ".", "" )
            c_tag := StrTran( c_tag, ",", "." )
            aTrib[ p_, i, 1 ] := c_tag
         ENDIF
      NEXT

      //Tags do Icms
      nIni := At( '<fieldset><legend>ICMS Normal e ST</legend>', cPar_ )
      IF nIni > 0
         cPar1_ := SubStr( cPar_, nIni, At( '<legend class="toggle">PIS</legend>', cPar_ ) -nIni )
         FOR i := 1 TO Len( aICMS[ p_ ] )
            nIni := At( aICMS[ p_, i, 3 ], cPar1_ )
            IF nIni > 0
               c_span := SubStr( cPar1_, nIni )
               nIni   := At( '<span>', c_span ) + 6
               nTamTag := At( '</span>', c_span ) - nIni
               c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
               IF aICMS[ p_, i, 4 ] != 0
                  IF aICMS[ p_, i, 4 ] > 0
                     c_tag := Left( c_tag, aICMS[ p_, i, 4 ] )
                  ELSE
                     c_tag := AllTrim( SubStr( c_tag, Abs( aICMS[ p_, i, 4 ] ) + 1 ) )
                     c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
                  ENDIF
               ENDIF
               c_tag := StrTran( c_tag, ".",  "" )
               c_tag := StrTran( c_tag, ",", "." )
               aICMS[ p_, i, 1 ] := c_tag
            ENDIF
         NEXT
      ENDIF

      //Tags do Ipi
      nIni := At( '<legend>Imposto Sobre Produtos Industrializados</legend>', cPar_ )
      IF nIni > 0
         cPar1_ := SubStr( cPar_, nIni, At( '<legend class="toggle">PIS</legend>', cPar_ ) -nIni )
         FOR i := 1 TO Len( aIPI[ p_ ] )
            nIni := At( aIPI[ p_, i, 3 ], cPar1_ )
            IF nIni > 0
               c_span := SubStr( cPar1_, nIni )
               nIni   := At( '<span>', c_span ) + 6
               nTamTag := At( '</span>', c_span ) - nIni
               c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
               IF aIPI[ p_, i, 4 ] != 0
                  IF aIPI[ p_, i, 4 ] > 0
                     c_tag := Left( c_tag, aIPI[ p_, i, 4 ] )
                  ELSE
                     c_tag := AllTrim( SubStr( c_tag, Abs( aIPI[ p_, i, 4 ] ) + 1 ) )
                     c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
                  ENDIF
               ENDIF
               c_tag := StrTran( c_tag, ".", "" )
               c_tag := StrTran( c_tag, ",", "." )
               aIPI[ p_, i, 1 ] := c_tag
            ENDIF
         NEXT i
      ENDIF

      //Tags Pis
      nIni := At( '<legend class="toggle">PIS</legend>', cPar_ )
      IF nIni > 0
         cPar1_ := SubStr( cPar_, nIni, At( '<legend class="toggle">COFINS</legend>', cPar_ ) -nIni )
         FOR i := 1 TO Len( aPIS[ p_ ] )
            nIni := At( aPIS[ p_, i, 3 ], cPar1_ )
            IF nIni > 0
               c_span := SubStr( cPar1_, nIni )
               nIni   := At( '<span>', c_span ) + 6
               nTamTag := At( '</span>', c_span ) - nIni
               c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
               IF aPIS[ p_, i, 4 ] != 0
                  IF aPIS[ p_, i, 4 ] > 0
                     c_tag := Left( c_tag, aPIS[ p_, i, 4 ] )
                  ELSE
                     c_tag := AllTrim( SubStr( c_tag, Abs( aPIS[ p_, i, 4 ] ) + 1 ) )
                     c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
                  ENDIF
               ENDIF
               c_tag := StrTran( c_tag, ".",  "" )
               c_tag := StrTran( c_tag, ",", "." )
               aPIS[ p_, i, 1 ] := c_tag
            ENDIF
         NEXT i
      ENDIF

      //Tags Cofins
      nIni := At( '<legend class="toggle">COFINS</legend>', cPar_ )
      IF nIni > 0
         cPar1_ := SubStr( cPar_, nIni )
         FOR i := 1 TO Len( aCOFINS[ p_ ] )
            nIni  := At( aCOFINS[ p_, i, 3 ], cPar1_ )
            IF nIni > 0
               c_span := SubStr( cPar1_, nIni )
               nIni   := At( '<span>', c_span ) + 6
               nTamTag := At( '</span>', c_span ) - nIni
               c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
               IF aCOFINS[ p_, i, 4 ] != 0
                  IF aCOFINS[ p_, i, 4 ] > 0
                     c_tag := Left( c_tag, aCOFINS[ p_, i, 4 ] )
                  ELSE
                     c_tag := AllTrim( SubStr( c_tag, Abs( aCOFINS[ p_, i, 4 ] ) + 1 ) )
                     c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
                  ENDIF
               ENDIF
               c_tag := StrTran( c_tag, ".",  "" )
               c_tag := StrTran( c_tag, ",", "." )
               aCOFINS[ p_, i, 1 ] := c_tag
            ENDIF
         NEXT
      ENDIF

      //Tags Medicamentos
      nIni := At( '<legend>Detalhamento específico dos medicamentos</legend>', cPar_ )
      IF nIni > 0
         cPar1_ := SubStr( cPar_, nIni )
         FOR i := 1 TO Len( aMedicamentos[ p_ ] )
            nIni := At( aMedicamentos[ p_, i, 3 ], cPar1_ )
            IF nIni > 0
               c_span := SubStr( cPar1_, nIni )
               nIni   := At( '<span>', c_span ) + 6
               nTamTag := At( '</span>', c_span ) - nIni
               c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
               IF aMedicamentos[ p_, i, 4 ] != 0
                  IF aMedicamentos[ p_, i, 4 ] > 0
                     c_tag := Left( c_tag, aMedicamentos[ p_, i, 4 ] )
                  ELSE
                     c_tag := AllTrim( SubStr( c_tag, Abs( aMedicamentos[ p_, i, 4 ] ) + 1 ) )
                     c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
                  ENDIF
               ENDIF
               IF i != 6
                  c_tag := StrTran( c_tag, ".",  "" )
                  c_tag := StrTran( c_tag, ",", "." )
               ENDIF
               IF StrZero( i, 2 ) $ "-03-04"
                  c_tag := SubStr( c_tag, 7, 4 ) + "-" + SubStr( c_tag, 4, 2 ) + "-" + Left( c_tag, 2 )
               ENDIF
               aMedicamentos[ p_, i, 1 ] := c_tag
            ENDIF
         NEXT
      ENDIF
      IF p_ == ( Len( aDet ) -1 )
         nIni := At( '<td class="fixo-prod-serv-numero"><span>' + AllTrim( Str( p_ + 1 ) ), cParT_ )
         cPar_ := SubStr( cParT_, nIni )
      ELSE
         nIni := At( '<td class="fixo-prod-serv-numero"><span>' + AllTrim( Str( p_ + 1 ) ), cParT_ )
         nFim := At( '<td class="fixo-prod-serv-numero"><span>' + AllTrim( Str( p_ + 2 ) ), cParT_ ) - nIni
         IF nFim == 0
            cPar_ := SubStr( cParT_, nIni )
         ELSE
            cPar_ := SubStr( cParT_, nIni, nFim )
         ENDIF
      ENDIF
   NEXT i
RETURN NIL
***************************************************
Static Function GeraBlocoTotais( cParte )
   FOR i := 1 TO Len( aTotais[ 1 ] )
      cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
      cPar_ := StrTran( cPar_, Chr( 160 ), "" )
      nIni := At( aTotais[ 1, i, 3 ], cPar_ )
      IF nIni > 0
         c_span := SubStr( cPar_, nIni )
         nIni   := At( '<span>', c_span ) + 6
         nTamTag := At( '</span>', c_span ) -nIni
         c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
         c_tag  := StrTran( c_tag, ".", "" )
         c_tag  := StrTran( c_tag, ",", "." )
         aTotais[ 1, i, 1 ] := c_tag
      ENDIF
   NEXT i
RETURN NIL
***************************************************
Static Function GeraBlocoTransp( cParte )
   FOR i := 1 TO Len( aTransp[ 1 ] )
      cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
      cPar_ := StrTran( cPar_, Chr( 160 ), "" )
      nIni := At( aTransp[ 1, i, 5 ], cPar_ )
      IF nIni > 0
         c_span := SubStr( cPar_, nIni )
         nIni   := At( '<span>', c_span ) + 6
         nTamTag := At( '</span>', c_span ) -nIni
         c_tag  := AllTrim( SubStr( c_span, nIni, nTamTag ) )
         IF i >= 2 .AND. i <= 3
            c_tag := StrTran( c_tag, ".", "" )
            c_tag := StrTran( c_tag, "/", "" )
            c_tag := StrTran( c_tag, "-", "" )
         ENDIF
         IF aTransp[ 1, i, 6 ] != 0
            IF aTransp[ 1, i, 6 ] > 0
               c_tag := Left( c_tag, aTransp[ 1, i, 6 ] )
            ELSE
               c_tag := AllTrim( SubStr( c_tag, Abs( aTransp[ 1, i, 6 ] ) + 1 ) )
               c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
            ENDIF
         ENDIF
         aTransp[ 1, i, 1 ] := c_tag
      ENDIF
   NEXT i
RETURN NIL
***************************************************
Static Function GeraBlocoCobr( cParte )
   cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
   cPar_ := StrTran( cPar_, Chr( 160 ), "" )
   FOR i := 1 TO Len( aCobr[ 1 ] )
      nIni := At( '<span>', cPar_ )
      IF nIni > 0
         cPar_ := SubStr( cPar_, nIni + 6 )
         nTamTag := At( '</span>', cPar_ ) -1
         c_tag  := AllTrim( SubStr( cPar_, 1, nTamTag ) )
         c_tag  := StrTran( c_tag, ".", "" )
         c_tag  := StrTran( c_tag, ",", "." )
         IF StrZero( i, 2 ) $ "-02-05-08-11-14-17-20-23-26-29"
            c_tag := SubStr( c_tag, 7, 4 ) + "-" + SubStr( c_tag, 4, 2 ) + "-" + Left( c_tag, 2 )
         ENDIF
         aCobr[ 1, i, 1 ] := c_tag
      ELSE
         EXIT
      ENDIF
   NEXT i
RETURN NIL
***************************************************
Static Function NFeGravaXML( cOpc, cFileName )
   Local cPastaXml, cArqXml
   Local cXML:='<?xml version="1.0" encoding="UTF-8"?><nfeProc versao="'+cVersao+'" xmlns="http://www.portalfiscal.inf.br/nfe"><NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe versao="'+cVersao+'" Id="NFe'+cChave+'">'
   Default cOpc      := ""
   Default cFileName := ""
   cTagPai   := ""
   nFimTagPai:= 0
   For i:= 1 To Len(aIde[1])
           If ! Empty(aIde[1,i,3])
           nFimTagPai:=aIde[1,i,4]
           cTagPai+="|"+StrZero(nFimTagPai,2)+aIde[1,i,3]
           cXML+='<'+aIde[1,i,3]+'>'
           EndIf
           If ! Empty(aIde[1,i,1])
           cXML+= '<'+aIde[1,i,2]+'>'+aIde[1,i,1]+'</'+aIde[1,i,2]+'>'
           EndIf
           If i == nFimTagPai
           nIni:=RAT("|",cTagPai)
           cTag:=Substr(cTagPai,nIni+1)
           cXML+='</'+SubStr(cTag,3)+'>'
           cTagPai:=SubStr(cTagPai,1,nIni-1)
           If nIni>1
           nIni:=RAT("|",cTagPai)
           nFimTagPai:=Val(Substr(cTagPai,nIni+1,2))
           Else
           nFimTagPai:=0
           EndIf
           EndIf
   Next i
   For i:= 1 To Len(aEmit[1])
           If ! Empty(aEmit[1,i,3])
           nFimTagPai:= aEmit[1,i,4]
           cTagPai+="|"+StrZero(nFimTagPai,2)+aEmit[1,i,3]
           cXML   +='<'+aEmit[1,i,3]+'>'
           EndIf
           If !Empty(aEmit[1,i,1])
           cXML+= '<'+aEmit[1,i,2]+'>'+aEmit[1,i,1]+'</'+aEmit[1,i,2]+'>'
           EndIf
           If i == nFimTagPai
           nIni:= RAT("|",cTagPai)
           cTag:= Substr(cTagPai,nIni+1)
           cXML+= '</'+SubStr(cTag,3)+'>'
           cTagPai:= SubStr(cTagPai,1,nIni-1)
           If nIni > 1
           nIni      := RAT("|",cTagPai)
           nFimTagPai:= Val(Substr(cTagPai,nIni+1,2))
           Else
           nFimTagPai:= 0
           EndIf
           EndIf
   Next i
   For i:= 1 To Len(aDest[1])
           If !Empty(aDest[1,i,3])
           nFimTagPai:=aDest[1,i,4]
           cTagPai+="|"+StrZero(nFimTagPai,2)+aDest[1,i,3]
           cXML+='<'+aDest[1,i,3]+'>'
           EndIf
           If !Empty(aDest[1,i,1])
           cXML+='<'+aDest[1,i,2]+'>'+aDest[1,i,1]+'</'+aDest[1,i,2]+'>'
           EndIf
           If i == nFimTagPai
           nIni:= RAT("|",cTagPai)
           cTag:= Substr(cTagPai,nIni+1)
           cXML+= '</'+SubStr(cTag,3)+'>'
           cTagPai:= SubStr(cTagPai,1,nIni-1)
           If nIni > 1
                 nIni:= RAT("|",cTagPai)
           nFimTagPai:= Val(Substr(cTagPai,nIni+1,2))
           Else
           nFimTagPai:= 0
           EndIf
           EndIf
   Next i
   For p_:= 1 To Len(aDet)
           cXML+= '<det nItem="'+AllTrim(Str(p_))+'"><prod>'
           For i:= 1 To Len(aDet[p_])
           If !Empty(aDet[p_,i,1])
           cXML+= '<'+aDet[p_,i,2]+'>'+aDet[p_,i,1]+'</'+aDet[p_,i,2]+'>'
           EndIf
           Next
           lpoemTag:= .F.
           For i:= 1 To Len(aMedicamentos[p_])
           If i == 1
           If ! Empty(aMedicamentos[p_,i,1])
                           cXML+= '<med><nLote>' + aMedicamentos[p_,i,1] + '</nLote>'
                           lpoemTag:=.T.
           EndIf
           Else
           If ! Empty(aMedicamentos[p_,i,1])
                   If i == 6
                   cDiscAdicional:= '<'+aMedicamentos[p_,i,2]+'>'+ aMedicamentos[p_,i,1] + '</'+aMedicamentos[p_,i,2]+'>'
           Else
           cXML+='<'+aMedicamentos[p_,i,2]+'>'+ aMedicamentos[p_,i,1] + '</'+aMedicamentos[p_,i,2]+'>'
                   EndIf
           EndIf
           EndIf
           Next
           If lpoemTag
           cXML+='</med>'
           EndIf
           cXML+= '</prod><imposto>'
           For i:= 1 To Len(aTrib[p_])
                   If ! Empty(aTrib[p_,i,1])
                           cXML+='<'+aTrib[p_,i,2]+'>'+ aTrib[p_,i,1] + '</'+aTrib[p_,i,2]+'>'
                   EndIf
           Next i
           cXML+= '<ICMS>'
           cTag_:='ICMS'
           For i:= 1 To Len(aICMS[p_])
           If i == 1
           If ! Empty(aICMS[p_, 2, 1])
                           cTag_+= aICMS[p_, 2, 1]
           Else
                   cTag_+= 'SN' + aICMS[p_, 3, 1]
           EndIf
           cXML+= '<' + cTag_ + '>'
           EndIf
           If !Empty(aICMS[p_, i, 1])
           If aICMS[p_, 2, 1] == '00'
                   If StrZero(i, 2) $ "-01-02-04-06-07-08"
                   cXML+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           ElseIf aICMS[p_, 2, 1] == '10'
           If StrZero(i, 2) $ "-01-02-04-06-07-08-11-12-13-14-15-16"
           cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           ElseIf aICMS[p_, 2, 1] == '20'
           If StrZero(i, 2) $ "-01-02-04-05-06-07-08-09-10"
           cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           ElseIf aICMS[p_, 2, 1] == '30'
           If StrZero(i, 2) $ "-01-02-11-12-13-14-15-16-09-10"
           cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           ElseIf aICMS[p_, 2, 1] == '40' .Or. aICMS[p_, 2, 1] == '41' .Or. aICMS[p_, 2, 1] == '50'
           If StrZero(i, 2) $ "-01-02-09-10"
           cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           ElseIf aICMS[p_, 2, 1] == '51'
           If StrZero(i, 2) $ "-01-02-04-05-06-07-08-19-20-21"
           cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           ElseIf aICMS[p_, 2, 1] == '60'
                   If StrZero(i, 2) $ "-01-02-17-18"
                   cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           ElseIf aICMS[p_, 2, 1] == '70'
           If StrZero(i, 2) $ "-01-02-04-05-06-07-08-09-10-11-12-13-14-15-16"
                   cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           ElseIf aICMS[p_, 2, 1] == '90'
           If StrZero(i, 2) $ "-01-02-04-05-06-07-08-11-12-13-14-15-16"
           cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
                   EndIf
           Else
                   cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
           EndIf
           EndIf
           Next i
           cXML+='</'+cTag_+'></ICMS>'

           lpoemTag:= .F.
           For i:= 1 To Len(aIPI[p_])
           If i == 1
           If ! Empty(aIPI[p_,i,1])
                           cXML+= '<IPI><cEnq>' + aIPI[p_,i,1] + '</cEnq><IPITrib>'
                           lpoemTag:=.T.
           EndIf
           Else
           If ! Empty(aIPI[p_,i,1])
                           cXML+='<'+aIPI[p_,i,2]+'>'+ aIPI[p_,i,1] + '</'+aIPI[p_,i,2]+'>'
           EndIf
           EndIf
           Next
           If lpoemTag
           cXML+='</IPITrib></IPI>'
           EndIf

           lpoemTag:= .F.
           For i:= 1 To Len(aPIS[p_])
                   If i == 1
           If ! Empty(aPIS[p_, i, 1])
                   If Val(aPIS[p_, i, 1]) >= 1 .And. Val(aPIS[p_, i, 1]) <= 2
                   cXML+= '<PIS><PISAliq>'
                           ElseIf Val(aPIS[p_, i, 1]) == 3
                   cXML+= '<PIS><PISQte>'
                           ElseIf Val(aPIS[p_, i, 1]) >= 4 .And. Val(aPIS[p_, i, 1]) <= 9
                           cXML+= '<PIS><PISNT>'
                   ElseIf Val(aPIS[p_, i, 1]) >= 49 .And. Val(aPIS[p_, i, 1]) <= 99
                           cXML+= '<PIS><PISOutr>'
                   EndIf
                           lpoemTag:= .T.
           EndIf
           EndIf
      If ! Empty(aPIS[p_, i, 1])
           cXML+= '<' + aPIS[p_,i,2] + '>' + aPIS[p_,i,1] + '</' + aPIS[p_,i,2] + '>'
      EndIf
   Next i
      If lpoemTag
           If Val(aPIS[p_, 1, 1]) >= 1 .And. Val(aPIS[p_, 1, 1]) <= 2
            cXML+= '</PISAliq></PIS>'
           ElseIf Val(aPIS[p_, 1, 1]) == 3
            cXML+= '</PISQte></PIS>'
           ElseIf Val(aPIS[p_, 1, 1]) >= 4 .And. Val(aPIS[p_, 1, 1]) <= 9
           cXML+= '</PISNT></PIS>'
           ElseIf Val(aPIS[p_, 1, 1]) >= 49 .And. Val(aPIS[p_, 1, 1]) <= 99
           cXML+= '</PISOutr></PIS>'
           EndIf
      EndIf
   lpoemTag:=.F.
   For i:= 1 To Len(aCOFINS[p_])
           If i == 1
                           If !Empty(aCOFINS[p_,i,1])
                   If Val(aPIS[p_, 1, 1]) >= 1 .And. Val(aPIS[p_, 1, 1]) <= 2
                           cXML+= '<COFINS><COFINSAliq>'
                   ElseIf Val(aPIS[p_, 1, 1]) == 3
                   cXML+= '<COFINS><COFINSQte>'
                   ElseIf Val(aPIS[p_, 1, 1]) >= 4 .And. Val(aPIS[p_, 1, 1]) <= 9
                           cXML+= '<COFINS><COFINSNT>'
                   ElseIf Val(aPIS[p_, 1, 1]) >= 49 .And. Val(aPIS[p_, 1, 1]) <= 99
                           cXML+= '<COFINS><COFINSOutr>'
                   EndIf
                           lpoemTag:=.T.
           EndIf
           EndIf
           If !Empty(aCOFINS[p_,i,1])
           cXML+= '<' + aCOFINS[p_, i, 2] + '>' + aCOFINS[p_, i, 1] + '</' + aCOFINS[p_, i, 2] + '>'
           EndIf
           Next i
           If lpoemTag
           If Val(aPIS[p_, 1, 1]) >= 1 .And. Val(aPIS[p_, 1, 1]) <= 2
           cXML+= '</COFINSAliq></COFINS>'
   ElseIf Val(aPIS[p_, 1, 1]) == 3
           cXML+= '</COFINSQte></COFINS>'
   ElseIf Val(aPIS[p_, 1, 1]) >= 4 .And. Val(aPIS[p_, 1, 1]) <= 9
           cXML+= '</COFINSNT></COFINS>'
   ElseIf Val(aPIS[p_, 1, 1]) >= 49 .And. Val(aPIS[p_, 1, 1]) <= 99
           cXML+= '</COFINSOutr></COFINS>'
   EndIf
           EndIf
           cXML+= '</imposto>'
           If ! Empty(cDiscAdicional)
           cXml+= cDiscAdicional
           EndIf
           cXML+= '</det>'
   Next
   cXML+='<total><ICMSTot>'
   For i:= 1 To Len(aTotais[1])
           If !Empty(aTotais[1,i,1])
           cXML+= '<'+aTotais[1,i,2]+'>'+aTotais[1,i,1]+'</'+aTotais[1,i,2]+'>'
           EndIf
   Next i
   cXML+= '</ICMSTot></total>'
   For i:= 1 To Len(aTransp[1])
           If !Empty(aTransp[1,i,3])
           nFimTagPai:= aTransp[1,i,4]
           cTagPai+= "|"+StrZero(nFimTagPai,2)+aTransp[1,i,3]
           cXML+= '<'+aTransp[1,i,3]+'>'
           EndIf
           If ! Empty(aTransp[1,i,1])
           cXML+= '<'+aTransp[1,i,2]+'>'+aTransp[1,i,1]+'</'+aTransp[1,i,2]+'>'
           EndIf
           If i == nFimTagPai
           nIni:= RAT("|",cTagPai)
           cTag:= Substr(cTagPai,nIni+1)
           cXML+= '</'+SubStr(cTag,3)+'>'
           cTagPai:= SubStr(cTagPai,1,nIni-1)
           If nIni > 1
           nIni      := RAT("|",cTagPai)
           nFimTagPai:= Val(Substr(cTagPai,nIni+1,2))
           Else
           nFimTagPai:=0
           EndIf
           If SubStr(cTag,3)=="vol"
           cXML+='</transp>'
           EndIf
   EndIf
   Next i
   If ! Empty(aCobr[1,1,1])
           cXML+= '<cobr>'
           For i:= 1 To Len(aCobr[1])
           If ! Empty(aCobr[1,i,1])
           If StrZero(i,2) $ "-01-04-07-10-13-16-19-22-25-28"
                           If i > 2
                           cXML+= '</dup>'
                           EndIf
                           cXML+= '<dup>'
           EndIf
           cXML+= '<'+aCobr[1,i,2]+'>'+aCobr[1,i,1]+'</'+aCobr[1,i,2]+'>'
           EndIf
           Next
           cXML+= '</dup></cobr>'
   EndIf
   If ! Empty(cinfCpl) .or. !Empt(cinfAdFisco)
           cXML+= '<infAdic>'
           If ! Empty(cinfAdFisco)
           cXML+= '<infAdFisco>' + cinfAdFisco + '</infAdFisco>'
           EndIf
           If ! Empty(cinfCpl)
           cXML+= '<infCpl>' + cinfCpl + '</infCpl>'
           EndIf
           cXML+= '</infAdic>'
   EndIf
   cXML+= '</infNFe>'
   cXML+= '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />'
   cXML+= '<Reference URI="#NFe' + cChave + '">'
   cXML+= '<Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />'
   cXML+= '<DigestValue>' + cdigVal + '</DigestValue></Reference></SignedInfo><SignatureValue></SignatureValue><KeyInfo></KeyInfo></Signature></NFe>'
   cXML+= '<protNFe versao="'+cVersao+'"><infProt>'
   cXML+= '<tpAmb>'+ctpAmb+'</tpAmb><verAplic>'+cverAplic+'</verAplic><chNFe>'+cChave+'</chNFe><dhRecbto>'+cdhRecbto+'</dhRecbto>'
   cXML+= '<nProt>'+cnProt+'</nProt><digVal>'+cdigVal+'</digVal><cStat>'+ccStat+'</cStat><xMotivo>'+cxMotivo+'</xMotivo>'
   cXML+= '</infProt></protNFe></nfeProc>'

   cArqXml := cChave + "-nfe.xml"

   if Upper(cOpc)="XMLENT" // -> Arquivo XML para Entrada no Estoque
      *-----------------------------------------------*
      * VERIFICA SE A PASTA XmlEnt EXISTE             *
      *-----------------------------------------------*
      cPastaXml := iif(Right(pDado,1)="\", pDado, pDado+"\") + "NFe"
      if !lIsDir( cPastaXml ) // se não existir a pasta cria primeiro a pasta \NFE
         if DirMake( cPastaXml ) != 0
            cPastaXml := pDado
         endif
      endif
      cPastaXml := iif(Right(pDado,1)="\", pDado, pDado+"\") + "NFe\XmlEnt"
      if !lIsDir( cPastaXml ) // se não existir a pasta cria \NFE\XmlEnt
         if DirMake( cPastaXml ) != 0
            cPastaXml := pDado
         endif
      endif
      cArqXml   := cFileName := cPastaXml + "\" + oChaveNFe_value + "-nfe.xml"
      nArqHandle:= FCREATE(cArqXml, 0 )
      FWRITE(nArqHandle,cXML)
      FCLOSE(nArqHandle)

   else                    // -> Arquivo que será utilizado para linkar com a NF-e de Saída
      cArqXml   := cFileName := pDado + "NFe\XML\" + oChaveNFe_value + "-nfe.xml"
      nArqHandle:= FCREATE(cArqXml, 0 )
      FWRITE(nArqHandle,cXML)
      FCLOSE(nArqHandle)
      ArqNfe := NFeBACKUP( cArqXml ) // Copia o arquivo da pasta do sistema para a pasta do ACBr

   endif

   MsgInfo(cArqXml+" criado com sucesso!","(OASyS) Baixa do XML")
Return nil

***************************************************
Static Function DigitoChave(CodigoChave)
   Local indice:= '4329876543298765432987654329876543298765432'
   Local digito
   nSoma:= 0
   For contador:= 1 To 43
      nSoma+= (Val(SubStr(CodigoChave, contador, 1)) * Val(SubStr(indice, contador, 1)))
   Next
   digito:= (nSoma % 11)
   If digito == 0 .Or. digito == 1
      digito:= 0
   Else
      digito:= (11 - digito)
   EndIf
   If SubStr(CodigoChave, 44, 1) != LTrim(Str(digito, 1))
      MsgStop('Código da Chave Errado....',"(OASyS) Baixa do XML")
      oChaveNFe:SetFocus()
      Return .f.
   EndIf
Return .t.
***************************************************
Static Function Troca_Acento(cTexto)
   cTexto := StrTran( cTexto, "&#243;", "ó" )
   cTexto := StrTran( cTexto, "&#225;", "á" )
Return cTexto
***************************************************
Static Function AtualizaImagem3( )
   Local oServer, cHtml, nInie, cHtml1, nFime, cMsgErro, nIni, nFim, nIni1, nConta := 0
   Local nFim1, nIni2, nFim2, nIni3, nFim3, nIni4, nFim4, cFileString1, cFileString2
   do while nConta <= 5

      if file("Captcha.png")
         ferase("captcha.png")
      endif

      nConta ++

      Try
         oServer:= CreateObject( "MSXML2.ServerXMLHTTP.6.0")
      Catch
         MsgInfo('Erro na Criação do Serviço!', 'Atenção!')
         exit
      End

      Try

         oServer:Open( "GET", cUrl, .f. )
         oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
         oServer:SetRequestHeader( "Connection", "keep-alive" )
         oServer:Send()
         oServer:WaitForResponse( 10000 )

      Catch
         MsgInfo('Erro na conexão com o site!', 'Atenção!')
         exit
      End

      cHtml           := oServer:ResponseBody
      s_cStringCookie := oServer:getResponseHeader("Set-Cookie")
      nInie           := At('id="ctl00_ContentPlaceHolder1_lblMensagemErro">', cHtml) + 47

      If nInie > 47
         cHtml1   := SubStr( cHtml, nInie)
         nFime    := At('</span>', cHtml1) - 1
         cMsgErro := SubStr(cHtml, nInie, nFime)
         If !Empty(cMsgErro)
            MsgInfo(cMsgErro, 'Erro no Site ' + URL_CONSULTA)
            exit
         EndIf
      EndIf

      nIni                  := At('id="__VIEWSTATE" value=', cHtml) + 24
      cHtml1                := SubStr( cHtml, nIni)
      nFim                  := At('" />', cHtml1) - 1
      s_cViewState          := SubStr(cHtml, nIni, nFim)

      nIni1                 := At('id="__EVENTVALIDATION" value="', cHtml) + 30
      cHtml1                := SubStr( cHtml, nIni1)
      nFim1                 := At('" />', cHtml1) - 1
      s_cEventValidation    := SubStr(cHtml, nIni1, nFim1)

      nIni2                 := At('id="__VIEWSTATEGENERATOR" value="', cHtml) + 33
      cHtml1                := SubStr( cHtml, nIni2)
      nFim2                 := At('" />', cHtml1) - 1
      s_cViewStateGenerator := SubStr(cHtml, nIni2, nFim2)

      nIni3                 := At('id="ctl00_ContentPlaceHolder1_token" value="', cHtml) + 44
      cHtml1                := SubStr( cHtml, nIni3)
      nFim3                 := At('" />', cHtml1) - 1
      s_cHiddenToken        := SubStr(cHtml, nIni3, nFim3)

      nIni4                 := At('id="ctl00_ContentPlaceHolder1_captchaSom" value="', cHtml) + 49
      cHtml1                := SubStr( cHtml, nIni4)
      nFim4                 := At('" />', cHtml1) - 1
      s_cHiddenSom          := SubStr(cHtml, nIni4, nFim4)

      nIni                  := At('data:image/png;base64,', cHtml) + 22
      cHtml1                := SubStr(cHtml, nIni)
      nFim                  := At('" />', cHtml1) - 1
      cFileString1          := SubStr(cHtml, nIni, nFim)
      cFileString2          := HB_Base64Decode(cFileString1)


*   cFile := hb_base64Decode(cFile, cCodigo)
*   FWrite(txt_file, cFile)
*   FClose(txt_file)


      If Empty(cFileString1)
         loop
      EndIf

      if Upper(Right(ALLTRIM(cFileString1),5))=='SUQMC'
         SysWait(0.5)
         loop
      endif

      txt_file:=fcreate("captcha.png", 0)
      If (!(ferror() = 0))
         MsgInfo("Erro de criacao do arquivo de imagem (CAPTCHA)" + Str(ferror(), 3, 0),"(OASyS) Baixa do XML")
         Return .f.
      EndIf

      FWrite(txt_file, cFilestring2)
      FClose(txt_file)

      oImg_captcha:loadbmp("captcha.png")
      oImg_captcha:refresh()

      Button_1_Enabled:=.T.

      exit

   enddo
   if nConta > 5
      MsgStop('Erro ao tentar obter a imagem (CAPTCHA). Tente novamente!',"(OASyS) Baixa do XML")
   endif
Return
***************************************************
Static Function AtualizaImagem()
  local nconta:=0
  do while nConta <= 5
   if file("Captcha.png")
      ferase("captcha.png")
   endif

   nconta++

   Try
      oServer:= CreateObject( "MSXML2.ServerXMLHTTP.6.0")
   Catch
      MsgInfo('Erro na Criação do Serviço',"(OASyS) Baixa do XML")
      Return .f.
   End
   Try
      oServer:Open( "GET", cUrl, .f. )
      oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
      oServer:SetRequestHeader( "Connection", "keep-alive" )
      oServer:Send()
      oServer:WaitForResponse( 10000 )
   Catch
      MsgInfo('Erro na Conexão com o Site',"(OASyS) Baixa do XML")
      Return .f.
   End
   cHtml:= oServer:ResponseBody
   cStringCookie:= oServer:getResponseHeader("Set-Cookie")

   nInie   := At('id="ctl00_ContentPlaceHolder1_lblMensagemErro">',  cHtml) + 47
   If nInie > 47
      cHtml1  := SubStr( cHtml, nInie)
      nFime   := At('</span>', cHtml1) - 1
      cMsgErro:= SubStr(cHtml, nInie, nFime)
      If ! Empty(cMsgErro)
         MsgInfo(cMsgErro, 'Erro no Site ' + cUrl)
         Return .f.
      EndIf
   EndIf
   nIni  := At('id="__VIEWSTATE" value=',  cHtml) + 24
   cHtml1:= SubStr( cHtml, nIni)
   nFim  := At('" />', cHtml1) - 1
   cViewState:= SubStr(cHtml, nIni, nFim)

   nIni1 := At('id="__EVENTVALIDATION" value="',  cHtml) + 30
   cHtml1:= SubStr( cHtml, nIni1)
   nFim1 := At('" />', cHtml1) - 1
   cEeventValidation:= SubStr(cHtml, nIni1, nFim1)

   nIni2 := At('id="__VIEWSTATEGENERATOR" value="',  cHtml) + 33
   cHtml1:= SubStr( cHtml, nIni2)
   nFim2 := At('" />', cHtml1) - 1
   cViewStateGenerator:= SubStr(cHtml, nIni2, nFim2)

   nIni3 := At('id="ctl00_ContentPlaceHolder1_token" value="',  cHtml) + 44
   cHtml1:= SubStr( cHtml, nIni3)
   nFim3 := At('" />', cHtml1) - 1
   cHiddenToken:= SubStr(cHtml, nIni3, nFim3)

   nIni4 := At('id="ctl00_ContentPlaceHolder1_captchaSom" value="',  cHtml) + 49
   cHtml1:= SubStr( cHtml, nIni4)
   nFim4 := At('" />', cHtml1) - 1
   cHiddenSom:= SubStr(cHtml, nIni4, nFim4)

   nIni  := At('data:image/png;base64,',  cHtml) + 22
   cHtml1:= SubStr(cHtml, nIni)
   nFim  := At('" />', cHtml1) - 1

   cFile := SubStr(cHtml, nIni, nFim)

   cCodigo:= SubStr(cHtml, nIni, nFim)
   If Empty(cCodigo)
      MsgInfo("Erro de criacao do arquivo de imagem (CAPTCHA)","(OASyS) Baixa do XML")
      Return .f.
   EndIf

   if Upper(Right(ALLTRIM(cCodigo),5))=='SUQMC'
      SysWait(0.5)
      loop
   endif

   cFile := hb_base64Decode(cFile, cCodigo)

   txt_file:=fcreate("captcha.png", 0)
   If (!(ferror() = 0))
      MsgInfo("Erro de criacao do arquivo de imagem (CAPTCHA)" + Str(ferror(), 3, 0),"(OASyS) Baixa do XML")
      Return .f.
   EndIf


   FWrite(txt_file, cFile)
   FClose(txt_file)

   oImg_captcha:loadbmp("Captcha.png")
   oImg_captcha:refresh()

   if file("Captcha.png")
      Button_1_Enabled:=.T.
   else
      button_1_Enabled:=.F.
   endif

   exit

  enddo

  if nConta > 5
     MsgStop('Erro ao tentar obter a imagem (CAPTCHA). Tente novamente!',"(OASyS) Baixa do XML")
  endif
Return .t.
***************************************************
* FIM DA ROTINA NFEBAIXAXML() *
***************************************************

 

Link to comment
Share on other sites

Ola... Bom dia a todos

 

Tenho uma solução que fiz a partir da DLL da FLEXDOCs onde baixo todos os XML destinados  para o CNPJ do CLIENTE, é muito rápido e eficiente, e até traz as NFe canceladas.

 

Muito melhor que montar XML a partir do portal, o qual EU acho que não tem validade jurídica.

Link to comment
Share on other sites

 

Ola... Bom dia a todos

 

Tenho uma solução que fiz a partir da DLL da FLEXDOCs onde baixo todos os XML destinados  para o CNPJ do CLIENTE, é muito rápido e eficiente, e até traz as NFe canceladas.

 

Muito melhor que montar XML a partir do portal, o qual EU acho que não tem validade jurídica.

Colega eu tb tinha um rotina desta usando a flexdocs, mais coisa de uns 2 meses  parou de funcionar, sabe me dize se houve alguma mudança em servidores ou algo do tipo.

 

Obrigado

Luiz Fernando

 

Link to comment
Share on other sites

 

Oscar, poste o .RC deste dialogo porfa: 


define dialog principal resource "nfebxxml" title

Pessoal

Boa tarde

Esta rotina está ficando muito desatualizada diante das alterações  que vem ocorrendo na NF-e, inclusive tempos atrás eu tive problemas com conteúdo do xml baixado,  no qual faltava as informações do DIFAL e ao questionar o criador (Membro do fórum do PC-TOLEDO), disse que as alterações ficasse a cargo de cada usuário da rotina.

O Alessandro deu uma boa força nisso, fazendo várias atualizações e correções e disponibilizando aqui para uso geral. Sobre a validade jurídica, o xml tem validade desde de que, este contenha a assinatura com todas as suas obrigações de validade, protocolo, digest value e etc...então se o conteúdo do mesmo estive íntegro e mesmo que não tenha estas informações, basta submete-lo a consulta no sefaz que estas gravadas.

Obs: Temos que ter é muito cuidado com xml's adulterados e submetidos a consulta no sefaz com gravação das informações de validade, pois isso pode ser feito sem muito conhecimento.

[]s,

 

Link to comment
Share on other sites

 

Pessoal

Boa tarde

Esta rotina está ficando muito desatualizada diante das alterações  que vem ocorrendo na NF-e, inclusive tempos atrás eu tive problemas com conteúdo do xml baixado,  no qual faltava as informações do DIFAL e ao questionar o criador (Membro do fórum do PC-TOLEDO), disse que as alterações ficasse a cargo de cada usuário da rotina.

O Alessandro deu uma boa força nisso, fazendo várias atualizações e correções e disponibilizando aqui para uso geral. Sobre a validade jurídica, o xml tem validade desde de que, este contenha a assinatura com todas as suas obrigações de validade, protocolo, digest value e etc...então se o conteúdo do mesmo estive íntegro e mesmo que não tenha estas informações, basta submete-lo a consulta no sefaz que estas gravadas.

Obs: Temos que ter é muito cuidado com xml's adulterados e submetidos a consulta no sefaz com gravação das informações de validade, pois isso pode ser feito sem muito conhecimento.

[]s,

 

Amigos... Meu pitaco.

Faz muito tempo que retirei do meu Sistema esse tipo de responsabilidade e as transferi para os meus Clientes.

Quando for necessário, eles acessam o site oficial e baixam seus respectivos arquivos xml sem a interferência do Sistema.

Acredito que não devemos correr riscos desnecessários por tudo isso que o amigo Jorge falou.

Essa é apenas a minha opinião. 

Link to comment
Share on other sites

Pessoal observe que a rotina da flexdocs funciona correto, é que houve mudanças recente, como o Jackson dize acima, não ter uma opção desta no sistema hoje em dia é f... pq todos sistemas tem, o bom que usando da flexdocs não precisa nem ter a chave, aparece todas NFE disparada para aquele CNPJ, aonde alem de fazer o manifesto podemos baixar em bloco(varios xml de uma unica vez), e outro detalhe, hoje em dia tem muita empresa que faz uma NFE para o CNPJ de nossos clientes apenas para fazer boleto, e trocar no banco, pelo fato do juros ser baixo, sem o conhecimento do CNPJ do destinatario.

 

Obs: sobre xml  adulterados , não tem como usando a rotina da flexdocs, pq ele pega o XML direto no sefaz.

Link to comment
Share on other sites

 

Pessoal observe que a rotina da flexdocs funciona correto, é que houve mudanças recente, como o Jackson dize acima, não ter uma opção desta no sistema hoje em dia é f... pq todos sistemas tem, o bom que usando da flexdocs não precisa nem ter a chave, aparece todas NFE disparada para aquele CNPJ, aonde alem de fazer o manifesto podemos baixar em bloco(varios xml de uma unica vez), e outro detalhe, hoje em dia tem muita empresa que faz uma NFE para o CNPJ de nossos clientes apenas para fazer boleto, e trocar no banco, pelo fato do juros ser baixo, sem o conhecimento do CNPJ do destinatario.

 

Obs: sobre xml  adulterados , não tem como usando a rotina da flexdocs, pq ele pega o XML direto no sefaz.

Luiz, concordo que deixar de ter uma opção no sistema pode ser contraproducente diante da tecnologia que temos em mãos, mas é uma responsabilidade há mais, usando rotinas de terceiros ou não homologadas, assim como esta.

Temos que obrigar os fornecedores a enviar os arquivos xml's  e no sistema dos nossos clientes, enviar os arquivos para os destinatários e com isso, ficamos isentos destas responsabilidades.

Todo e qualquer recurso é bem vindo, desde de que não sejamos questionados depois pela falta de informação. Se o xml baixado for exatamente igual ao enviado e recebido com a autorização do sefaz, maravilha, mas ainda assim a fonte de origem da pesquisa e download continua sobre o desenvolvedor da rotina.

O caso que citei sobre perceber a ausência das tags do DIFAL me assustou a ponto até parar de testar a rotina, mesmo sabendo que o o pessoal tem se esforçado para deixar ela supimpa.

[]s,

Link to comment
Share on other sites

 

Nāo uso o flexdocs para emitir NFe. Se for usar cada cliente do meu sistema precisará adquirir essa biblioteca só para baixar os xml?

Oscar precisa sim ter uma licença, mais o ACBR tb tem esta funcionalidade, dai é livre, o Giovany Vechinni usa a do ACBR

 

 

O caso que citei sobre perceber a ausência das tags do DIFAL me assustou a ponto até parar de testar a rotina, mesmo sabendo que o o pessoal tem se esforçado para deixar ela supimpa.

[]s,

Colega não sei a solução da fsist citada pelo amigo acima como procede, mais da flexdocs qdo questionei eles, disseram que pega o XML direto do sefaz, tipo eles não monta o xml com as informações, vou pesquisar mais sobre isto, pq escritorios contabil baixa xml em bloco usando programas de terceiro.

 

Link to comment
Share on other sites

  • 3 weeks later...

Algo que talvez seja irrelevante, mas que eu gostaria de compartilhar é que no XML gerado, as tags pesoL e pesoB estão usando a vírgula como separador de decimal e.o correto seria utilizar ponto. Acho que isso não vai interferir em nada, mas estou dizendo a título de curiosidade.

 

 

 

Link to comment
Share on other sites

usando DLL flex docs + DLL fsist  (para marcelo.silva )

obs: uma amigo do forum que nao lembro o nome publicou boa parte do codigo abaixo:

#include 'fivewin.ch'
#include 'hbdll.ch'

#define CLR_DIALOGS RGB( 123, 140, 223 )

static s_hDLL

Function DownloadNFe(cChave, cSerial, lNfe, lEnt)
 Local oDlg, oFont, oFont2, oFont3, oChave, oCaptcha, oImage, cCaptcha:=Space(6), oIni, oNfeUtil

   DEFAULT cChave := Space(44)
   DEFAULT lNfe := .f.
   DEFAULT lEnt := .f.

   CarregaDLL()

   If cSerial="COM"
      oNfeUtil:=TVoNfeUtil2g():New(Empr->Est_Empr, Empr->Mod_Empr, GetPvProfString( "CONFIGURACAO", "CERTIFICADO", "", "VoNfeCertSign.Ini"),,,, GetPvProfString( "CONFIGURACAO", "LICENCA", "", "VoNfeCertSign.Ini"))

      If oNFeUtil == nil
         Return( .f. )
      Endif

      If Empty(oNFEUtil:cCertificado)
         MsgInfo("Informar certificado válido!", "Aviso!")
         oNfeUtil:End()
         Return nil
      Endif

      oNFeUtil:PegaCertificado("")
      If oNFeUtil:PegaDadosCertificado()
         cSerial := oNFeUtil:NroSerieCertificado
      Endif
   Endif

      DEFINE FONT oFont NAME "Lucida Console" SIZE 0,-14
      DEFINE DIALOG oDlg FROM 4, 4 TO 22, 82 TITLE "Download XML NFe "+If(cSerial="SEM", "SEM Certificado", "COM Certificado Nº: "+cSerial)

      @ 36, 112 SAY "Chave:"   OF oDlg PIXEL FONT oFont
      @ 63, 112 SAY "Captcha:" OF oDlg PIXEL FONT oFont

      @ 44, 112 GET oChave   VAR cChave   OF oDlg PIXEL FONT oFont SIZE 184, 13 PICTURE '@9' VALID ValidaChaveConsulta(cChave)
      @ 72, 112 GET oCaptcha VAR cCaptcha OF oDlg PIXEL FONT oFont SIZE  34, 13 //PICTURE '@A'

      @ 34,   4 IMAGE oImage OF oDlg PIXEL SIZE 104, 54 ADJUST

         @ 122,   4 BTNBMP OF oDlg SIZE 45, 12 PIXEL 2007 NOBORDER PROMPT "Captcha" ACTION AtualizaCaptcha(oCaptcha, oDlg, oImage)
         @ 122, 200 BTNBMP OF oDlg SIZE 45, 12 PIXEL 2007 NOBORDER PROMPT "Baixar"  ACTION XmlDownload(oChave, cChave, oCaptcha, cCaptcha, cSerial, oDlg, oImage, lNfe, lEnt)
         @ 122, 252 BTNBMP OF oDlg SIZE 45, 12 PIXEL 2007 NOBORDER PROMPT "Sair"    ACTION oDlg:End() CANCEL

oDlg:lHelpIcon:=.f.
      ACTIVATE DIALOG oDlg CENTERED ON INIT (DlgBarTitle(oDlg, "  Download XML NFe "+If(cSerial="SEM", "SEM Certificado", "COM Certificado"), "" , 44), AtualizaCaptcha(oCaptcha, oDlg, oImage)) ON PAINT DlgStatusBar(oDlg, 68,, .t.) VALID(FinalizaDLL(), .t.)
   oFont:end()

Return cChave
//------------------------------------------------------------------------------
Static Function ValidaChaveConsulta( cChave )

   If Len(cChave)<44
      Return .f.
   Endif

Return .t.
//------------------------------------------------------------------------------
function CarregaDLL()

   If s_hDLL == nil
      If !File("BaixarXMLNFe.dll")
         MsgStop( "DLL não encontrada, verifique!", "Aviso!")
         Return .f.
      Endif
      s_hDLL := LoadLibrary("BaixarXMLNFe.dll")
      DllRegistra()
      DllLicenca("AQUI VC COLOCA A LICENÇA DA FSIST")    
   Endif

Return nil
//------------------------------------------------------------------------------
Function SetProxyDownloadNFe(lProxy, cIP, nPorta, cUsuario, cSenha)

   If lProxy
      Proxy( cIP, nPorta, cUsuario, cSenha )
   Else
      Proxy( '', 0, '', '' )
   Endif

return nil
//------------------------------------------------------------------------------
Function FinalizaDLL()

   If !Empty(s_hDLL)
      FreeLib32(s_hDLL)
      s_hDLL := nil
   Endif

Return nil
//------------------------------------------------------------------------------
Static Function XmlDownload(oChave, cChave, oCaptcha, cCaptcha, cSerial, oDlg, oImage, lNfe, lEnt)
   Local bDownload, nRetorno, nErro, cErro, cArquivoXML

   If lNfe
      cArquivoXML := oApp:cDir_002+"remessa\protocolos\"+cChave+"-nfe.xml"
   Else
      If lEnt
         cArquivoXML := oApp:cDir_002+"xmlent\"+cChave+".xml"
      Else
         cArquivoXML := oApp:cDir_001+"temp\"+cChave+".xml"
      Endif
   Endif

   If Len(cChave) < 44
      MsgStop( "Chave tem que ter 44 digitos!", "Aviso!" )
      oChave:setFocus()
      Return nil
   Endif

   If Len(cCaptcha) < 6
      MsgStop("Favor informar o captcha corretamente!", "Aviso!")
      oCaptcha:setFocus()
      Return nil
   Endif

   If cSerial="SEM"
      bDownload := { || nRetorno := BaixarXMLNFeSemCert( cChave, cCaptcha, cArquivoXML ) }
   Else
      bDownload := { || nRetorno := BaixarXMLNFeComCert( cChave, cCaptcha, cArquivoXML ) }
      SetCertificadoDigital(cSerial)
   Endif

   MsgRun( "Realizando Download XML...", "Aguarde!", bDownload )

   If nRetorno == 1
      MsgInfo( "Download realizado com sucesso"+CRLF+cArquivoXML, "NFe"+If(cSerial="SEM", "sem", "com" )+" certificado digital" )
      oDlg:End()
   Else
      nErro := MsgCode()
      do case
         case nErro == 1
            cErro := "É necessário digitar a chave da nfe."
         case nErro == 2
            cErro := "É necessário digitar o captcha."
         case nErro == 3
            cErro := "Código da Imagem inválido. Tente novamente."
         case nErro == 4
            cErro := "NF-e INEXISTENTE na base nacional."
         otherwise
            cErro := "Desconhecido"
      endcase

      MsgStop("Não foi possível realizar o download do XML!"+CRLF+"Erro "+AllTrim(Str(nErro))+": "+cErro, "Erro!")
      AtualizaCaptcha(oCaptcha, oDlg, oImage)

      oCaptcha:cText(Space(6))
      oCaptcha:setFocus()
      oCaptcha:setPos(1)
   Endif

Return nil
//------------------------------------------------------------------------------
Static Function AtualizaCaptcha(oCaptcha, oDlg, oImage)
  Local nRetorno

   MsgRun( "Atualizando Captcha...", "Aguarde!", { || nRetorno:=Captcha("Captcha.jpg") } )

   if nRetorno == 0   // retorna 1 ou 0, 1 é ok
      MsgStop("Não foi possível carregar o captcha!", "Aviso!")
      oDlg:end()
   else
      oImage:loadImage(,"Captcha.jpg")
      oImage:refresh()
   endif

Return nil
//------------------------------------------------------------------------------
DLL32 FUNCTION Captcha(SalvarEm AS STRING) AS LONG PASCAL LIB 'BaixarXMLNFe.dll'
DLL32 FUNCTION BaixarXMLNFeSemCert(Chave AS STRING, Captcha AS STRING, SalvarEm AS STRING) AS LONG PASCAL LIB 'BaixarXMLNFe.dll'
DLL32 FUNCTION BaixarXMLNFeComCert(Chave AS STRING, Captcha AS STRING, SalvarEm AS STRING) AS LONG PASCAL LIB 'BaixarXMLNFe.dll'
DLL32 FUNCTION GetCertificadoDigital() AS LONG PASCAL LIB 'BaixarXMLNFe.dll'
DLL32 FUNCTION SetCertificadoDigital(Cert AS STRING) AS LONG PASCAL LIB 'BaixarXMLNFe.dll'
DLL32 FUNCTION MsgCode() AS LONG PASCAL LIB 'BaixarXMLNFe.dll'
DLL32 FUNCTION DLLRegistra() AS LONG PASCAL LIB 'BaixarXMLNFe.dll'
DLL32 FUNCTION DLLLicenca(Chave AS STRING) AS LONG PASCAL LIB 'BaixarXMLNFe.dll'
DLL32 FUNCTION Proxy(Host AS STRING, Port AS LONG, User AS STRING, Pass AS STRING) AS LONG PASCAL LIB 'BaixarXMLNFe.dll'

 

Link to comment
Share on other sites

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...