Página 22 de 24

Consulta optante do simples online

Enviado: 19 Mar 2019 18:31
por Fernando queiroz
Alguém tem essa rotina em HWGUI to querendo incluir no meu sistema

Consulta optante do simples online

Enviado: 20 Mar 2019 15:01
por Fernando queiroz

Código: Selecionar todos

//=========================================================================
//
// Arquivo.....: impnfe.prg
// Criado em...: 09/05/2016 as 10:41:18
//
// Projeto.....: Importa NF-e da SEFAZ
//
// Programador.: Daniel Denobie - denobie@hotmail.com
//               alterado para HWgui em 20/03/2019 por
//               Fernando Queiroz - m5200n@hotmail.com
//=========================================================================


#include 'HWgui.ch'
#include 'hbcompat.ch'

MEMVAR aCobr, I, cInfCpl, cInfAdFisco, cDigVal, cChave, cVerAplic, cTpAmb, c_Span, cRet, aRet
MEMVAR cVersao, cArqXml, cIniFolder, nArqHandle, cxMotivo, ccStat, cnProt, cPart_, aFat, oDanfe
MEMVAR cDhRecbto, cTag, cTagPai, nIni, nFimTagPai, aTotais, cDiscAdicional, nContador, aIcmsPart
MEMVAR P_, aDet, aPis, aTransp, aCofins, aIpi, lpOemTag, cTag_, aIcms, aTrib, nSoma, aCompra
MEMVAR aMedicamentos, aEmit, aDest, aIde, c_Tag, cPar_, nTamTag, cPar1_, nFim, cFile, aEntrega
MEMVAR cParte, Contador, nTotPro, cHtml, cPart, cStringCookie, cViewState, cViewStateGenerator
MEMVAR nFim3, cHiddenToken, nIni4, cHtml1, nFim4, Txt_File, cCodigo, ceEventValidation, cIndPag
MEMVAR nIni1, nFim1, nIni2, nFim2, nIni3, cHiddenSom, cUrl, oServer, nInie, nFime, cUrl2, aRastro
MEMVAR cMsgErro, c, aItensNota, cFCI, aMedLote, aPagamento, nCP

***************************************
Function IMPNFE()
***************************************
	LOCAL oBitmap1, oGroup1, oLabel1, oChave_NFe, oIcon1, oTxt_captcha, oLabel2
	LOCAL Button_1, Button_2, Button_3, oSayImg

   Public cUrl := "https://www.nfe.fazenda.gov.br/portal/consultaResumoCompletaAntiga.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8%3D"
   Public cUrl2:= 'https://www.nfe.fazenda.gov.br/portal/consultaCompleta.aspx?tipoConteudo=XbSeqxE8pl8%3D'
   Public cCaptcha:=space(6), cCnpj, cStringCookie, cViewState, cEeventValidation, cHiddenToken, cCodigo, cViewStateGenerator
   Public cHiddenSom, cChave:=space(44)
   


  INIT DIALOG oDlg TITLE "Importar XML NF-e" ;
    AT 708,198 SIZE 732,336 ;
     STYLE DS_CENTER+DS_ABSALIGN ;
	 ON INIT {|| AtualizaImagem() }
	
	Principal	:= oDlg



   @ 9,1 BITMAP oBitmap1  ;
        SHOW 'CABNFE' FROM RESOURCE ;
        SIZE 715,130   
   @ 212,147 SAY oLabel1 CAPTION "Chave de Acesso da NF-e" OF oGroup1  SIZE 435,17    ;
        FONT HFont():Add( '',0,-16,400,,,)
   @ 213,169 GET oChave VAR cChave OF oGroup1  SIZE 495,28 ;
        STYLE WS_BORDER   PICTURE '99999999999999999999999999999999999999999999' MAXLENGTH 44   ;
		FONT HFont():Add( '',0,-19,400,,,)
   @ 213,213 GET oTxt_captcha VAR cCaptcha OF oGroup1  SIZE 83,28 ;
        STYLE WS_BORDER   MAXLENGTH 6   ;
		FONT HFont():Add( '',0,-19,400,,,)
   @ 303,216 SAY oLabel2 CAPTION "Digite o código da imagem ao lado" OF oGroup1  SIZE 326,22    ;
        FONT HFont():Add( '',0,-16,400,,,)
   @ 213,259 OWNERBUTTON Button_1  OF oGroup1  SIZE 99,26 ;
        TEXT 'Baixar'  ;
        COORDINATES 0, 0, 0, 0  ;
        FONT HFont():Add( '',0,-16,400,,,); 
		ON CLICK {|| IIF(Continuar(cCaptcha, cChave), oDlg:Close(), (cCaptcha:=space(6), Principal:oTxt_captcha:REFRESH(), principal:oTxt_captcha:SetFocus()) )  }
   @ 323,259 OWNERBUTTON Button_2  OF oGroup1  SIZE 99,26 ;
        TEXT 'Limpar'  ;
        COORDINATES 0, 0, 0, 0  ;
        FONT HFont():Add( '',0,-16,400,,,);
		ON CLICK {|| limpar( ) } 
   @ 606,259 OWNERBUTTON Button_3  OF oGroup1  SIZE 99,26 ;
        TEXT 'Sair'  ;
        COORDINATES 0, 0, 0, 0  ;
        FONT HFont():Add( '',0,-16,400,,,);
		ON CLICK {|| oDlg:Close() } 

   @ 12, 171 IMAGE oSayImg SHOW Nil OF oGroup1 SIZE 180, 70


   @ 9,129 GROUPBOX oGroup1 CAPTION ""  SIZE 715,172    ;
        FONT HFont():Add( '',0,-11,400,,,)


   ACTIVATE DIALOG principal
RETURN cChave

****************************************
STATIC Function Limpar()

	cChave:=space(44)
	cCaptcha:=space(6)
	Principal:oChave:REFRESH()
	Principal:oTxt_captcha:REFRESH()
	AtualizaImagem()
	principal:oChave:SetFocus()
	Return Nil

***************************************************
Function AtualizaImagem()

#require "hbfimage"

   Try
      oServer:= win_OleCreateObject("MSXML2.ServerXMLHTTP.6.0")
   Catch
   	hwg_MsgInfo('Erro na Criação do Serviço')
      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( 100000 )
   Catch
   	hwg_MsgInfo('Erro na Conexão com o Site')
      Return .f.
   End
   c:= oServer:getResponseHeader("Set-Cookie")
   cStringCookie:= Substr(c, 1, At(';', c) -1)
   cHtml:= oServer:ResponseBody
 //  MemoWrit('siteA.txt', cHtml)

   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)
			hwg_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)
   txt_file:=fcreate("captcha.png", 0)
   If (!(ferror() = 0))
		hwg_MsgInfo("Erro de criacao do arquivo de imagem " + Str(ferror(), 3, 0))
		Return .f.
   EndIf

   cCodigo:= SubStr(cHtml, nIni, nFim)
   If Empty(cCodigo)
		hwg_MsgInfo("Erro de criacao do arquivo de imagem")
		Return .f.
   EndIf
   cFile:= hb_base64Decode(cFile, cCodigo)
   FWrite(txt_file, cFile)
   FClose(txt_file)
   Principal:oSayImg:ReplaceImage( 'Captcha.png' )
   Principal:oSayImg:Refresh()
   principal:Button_1:Enabled()

	Return .t.

***************************************************
Function Continuar(cCaptcha, Chave)
Local cParm, oServer
Public cChave:= Chave, aItensNota:= {}

   If ! DigitoChave(cChave)
      Return Nil
   EndIf

   cParm:=  "__EVENTTARGET=" + ;
   			"&__EVENTARGUMENT=" + ;
   			"&__VIEWSTATE=" + Transfome(cviewState) + ;
            "&__VIEWSTATEGENERATOR=" + Transfome(cViewStateGenerator) + ;
            "&__EVENTVALIDATION=" + Transfome(cEeventValidation) + ;
            "&ctl00%24txtPalavraChave=" + ;
 				"&ctl00%24ContentPlaceHolder1%24txtChaveAcessoCompleta=" + cChave + ;
            "&ctl00%24ContentPlaceHolder1%24txtCaptcha=" + cCaptcha + ;
            "&ctl00%24ContentPlaceHolder1%24btnConsultar=Continuar" + ;
            "&ctl00%24ContentPlaceHolder1%24token=" + Transfome(cHiddenToken) + ;
            "&ctl00%24ContentPlaceHolder1%24captchaSom=" + Transfome(cHiddenSom) + ;
            "&hiddenInputToUpdateATBuffer_CommonToolkitScripts=1"
  	Try
      oServer:= win_OleCreateObject( "MSXML2.ServerXMLHTTP.6.0")
   Catch
		hwg_MsgInfo('Erro na Criação do Serviço')
		Return .f.
	End
	Try
      oServer:Open( "POST", cUrl, .f. )
   Catch
		hwg_MsgInfo('Erro na Conexão com o Site ' + cUrl)
		Return .f.
	End
  	oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
   oServer:SetRequestHeader( "Connection", "keep-alive" )
   oServer:SetRequestHeader( "Cookie", cStringCookie)
  	Try
   	oServer:Send(cParm)
      oServer:WaitForResponse( 500000 )
   Catch
		hwg_MsgInfo('Erro na Resposta com o Site ' + cUrl)
		Return .f.
	End
   cHtml:= oServer:ResponseBody
   MemoWrit('siteA.txt', cHtml)  //Usado para testar sem Baixar

   If At('<div id="ctl00_ContentPlaceHolder1_vdsErros" class="listaErro" style="display:none;">', cHtml) > 0
   	cPart:= Substr(cHtml, (At('<ul id="ctl00_ContentPlaceHolder1_bltMensagensErro" class="listaErro">', cHtml) + 80))
      cPart:= Substr(cPart, 1, (At('</li><li>', cPart) - 1))
      hwg_MsgInfo(Troca_Acento(cPart, 'aviso Erro'))
      Return .f.
   EndIf

   If At('<div class="divMensagemPaginaErro">', cHtml) > 0
      cPart:= Substr(cHtml, (At('<span id="ctl00_ContentPlaceHolder1_lblMensagemErro">', cHtml) + 53))
      cPart:= Substr(cPart, 1, (At('</span>', cPart) - 1))
      hwg_MsgInfo(Troca_Acento(cPart, 'aviso Erro'))
      Return .f.
   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)
      nTotPro:= 0
      c_span:= cFile
      While .t.
	      nIni   := At('fixo-prod-serv-numero"><span>', c_span)
	      If nIni > 0
	      	c_span:= SubStr(c_span, nIni + 29)
	      	nFim  := At('</span>', c_span) - 1
	      	AADD(aItensNota, Val(SubStr(c_span, 1, nFim)))
	   	   nTotPro ++
	   	Else
	   	   Exit
	   	EndIf
      End
      If nTotPro > 0
	    If TratamentoDados()
			GravaXML()
      	Else
      		hwg_MsgInfo('Erro no Tratamento do Dados')
      		Return  .f.
      	EndIf
      Else
      	hwg_MsgInfo('Erro no Tratamento do Dados')
      	Return .f.
      Endif
   Else
      hwg_MsgInfo('Erro ao ler retorno da Consulta')
      Return .f.
   EndIf
	Return .t.

*****************************************
Static Function Teste(chave)// Função para testar geração do xml sem ter que baixar
Public cChave:= Chave, aItensNota:= {}

   cHtml:= MemoRead('siteA.txt')

   If At('id="ctl00_ContentPlaceHolder1_pnlErro" class="painel_erro_sistema">', cHtml) > 0
      cPart:= Substr(cHtml, (At('<span id="ctl00_ContentPlaceHolder1_lblResultadoConsulta">', cHtml) + 58))
      cPart:= Substr(cPart, 1, (At('</span>', cPart) - 1))
      hwg_MsgInfo(Troca_Acento(cPart, 'aviso Erro'))
      Return .f.
   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)
      nTotPro:= 0
      c_span:= cFile
      While .t.
	      nIni   := At('fixo-prod-serv-numero"><span>', c_span)
	      If nIni > 0
	      	c_span:= SubStr(c_span, nIni + 29)
	      	nFim  := At('</span>', c_span) - 1
	      	AADD(aItensNota, Val(SubStr(c_span, 1, nFim)))
	   	   nTotPro ++
	   	Else
	   	   Exit
	   	EndIf
      End
      If TratamentoDados()
      	GravaXML()
      Else
      	hwg_MsgInfo('Erro no Tratamento do Dados')
      	Return  .f.
      EndIf
   Else
      hwg_MsgInfo('Erro ao ler retorno da Consulta')
      Return .f.
   EndIf
	Return .t.

***************************************
Function TratamentoDados()
Public aIde:={}, aEmit:={}, aDest:={}, aDet:={}, aICMS:={}, aIPI:={}, aPIS:={}, aCOFINS:={}, aTotais:={}, aTransp:={}, aCobr:={}
Public aMedicamentos:= {}, aTrib:= {}, aFat:={}, aCompra:= {}, aEntrega:= {}, aIcmsPart:= {}, aMedLote:={}, aPagamento:= {}
Public aRastro:= {}

* 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

   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-
               {"","cPais","",0,"País",4},; //13- tratamento especial
               {"","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-

    AADD(aEntrega,{{"","CNPJ","entrega",7,"CNPJ",0},; //1-
                   {"","xLgr","",15,"Logradouro",0},; //2- tratamento especial
                   {"","nro","",0,"Logradouro",0},; //3- tratamento especial
                   {"","xBairro","",0,"Bairro",0},; //4-
                   {"","cMun","",0,"Município",7},; //5-
                   {"","xMun","",0,"Município",-10},; //6-
                   {"","UF","",0,"UF",0}}) //7-

*   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","vICMSUFDest", "Valor Total ICMS Interestadual UF Destino"},;
					  {"0.00","vICMSUFRemet", "Valor Total ICMS Interestadual UF Rem."},;
                 {"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-
                 {"0.00","vTotTrib","Valor Aproximado dos Tributos"}}) //17-

*   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,"Numeração",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-

	AADD(aFat, {{"","nFat"},;  //1-
               {"","vOrig"},; //2-
               {"","vDesc"},; //3-
               {"","vLiq"}})  //4-

   AADD(aPagamento, {{"","tPag"  ,"Tipo de Integração Pagamento",2},; //2- {"","indPag","Forma de Pagamento",1},; //1-
                     {"","vPag"  ,"Valor do Pagamento",0},; //3-
                     {"","CNPJ"  ,"CNPJ da Credenciadora",0},; //4-
                     {"","tBand" ,"Bandeira da operadora",0},; //5-
                     {"","cAut"  ,"Número de autorização",0},; //6-
                     {"","vTroco","Troco",0}}) //7-

//    Conteudo elementos da Matriz = {VALOR_TAG,TAG,LABEL_HTML,TAM_LABEL}
//    Produtos e Serviços da NF-e
      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-
                   {"","indEscala","Indicador de Escala Relevante",0},; //6-
                   {"","CNPJFab"  ,"CNPJ do Fabricante da Mercadoria",0},; //6-
                   {"","cBenef"   ,"Código de Benefício Fiscal",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-
                   {"","infAdProd",'Descrição', 0},; //24-
                   {"","nFCI"     ,'Número da FCI', 0}}) //25-

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

         AADD(aCompra, {{"","xNEm","Nota de Empenho",0},; //1-
                        {"","xPed","Pedido",0},; //2-
                        {"","xCont","Contrato",0}}) //3-


         AADD(aRastro, {{"","nLote" , 'Número do Lote do produto', 0},; //1-
                        {"","qLote" , 'Quantidade de produto no Lote', 0},; //2-
                        {"","dFab"  , 'Data de fabricação/ Produção', 0},; //3-
                        {"","dVal"  , 'Data de validade', 0},;  //4-
                        {"","cAgreg", 'Código de Agregação', 0}}) //5-

         AADD(aMedicamentos, {{"","cProdANVISA"   ,'Código de Produto da ANVISA', 0},; //1-
                              {"","xMotivoIsencao",'Motivo da isenção da ANVISA', 0},; //2-
                              {"","vPMC"          ,'Preço Máximo Consumidor', 0}})     //3-

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

        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",1},; //4-
                    {"","pRedBC","Percentual Redução",0},; //5-
                    {"","vBC","Base de Cálculo",0},; //6-
                    {"","pICMS","Alíquota do ICMS",0},; //7-
                    {"","vICMS","Valor do ICMS<",0},; //8-
                    {"","vICMSDeson","Valor ICMS desoneração",0},; //9-
                    {"","motDesICMS","Motivo da desoneração do ICMS",1},; //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-

         AADD(aIcmsPart,{{"0.00", "vBCUFDest"     , "Valor BC ICMS na UF Destino"}          ,; //1-
                         {"0.00", "pFCPUFDest"    , "Percentual ICMS FCP na UF Destino"}    ,; //2-
                         {"0.00", "pICMSUFDest"   , "Alíquota Interna UF Destino"}          ,; //3-
                         {"0.00", "pICMSInter"    , "Alíquota Interestadual das UFs"}       ,; //4-
                         {"0.00", "pICMSInterPart", "Percentual Provisório de Partilha"}    ,; //5-
					          {"0.00", "vFCPUFDest"    , "Valor do ICMS FCP"}                    ,; //6-
                         {"0.00", "vICMSUFDest"   , "Valor ICMS Interestadual UF Destino"}  ,; //7-
                         {"0.00", "vICMSUFRemet"  , "Valor ICMS Interestadual UF Remetente"}}) //8-

		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('Local de Entrega', cFile)
      cParte:= SubStr(cFile, nIni)
      nIni  := At('</div>', cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //Local de Entrega
      GeraBlocoEntrega(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('ICMS para a UF de destino', cFile)
      cParte:= SubStr(cFile, nIni)
      nIni  := At('</tr></table></fieldset>', cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //icms Partilha
      GeraBlocoIcmsPart(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('Informações de Compra</legend>', cFile)
      cParte:= SubStr(cFile, nIni + 30)
      nIni  := At('<legend>Informações Complementares de Interesse do Contribuinte', cParte)
      cParte:= SubStr(cParte, 1, nIni - 1)  //compra
      GeraBlocoCompra(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

      nIni  := At('<legend>Fatura</legend><table', cFile)
      If nIni > 0
      	cParte:= SubStr(cFile, nIni)
        	nIni  := At('</table>', cParte)
	      cParte:= SubStr(cParte, 1, nIni - 1)  //fatura
   	   GeraBlocoFat(cParte)
      EndIf

      nIni  := At('<legend class="titulo-aba">Formas de Pagamento</legend>', cFile)
      If nIni > 0
      	cParte:= SubStr(cFile, nIni)
        	nIni  := At('<div id="aba_nft_7" class="nft">', cParte)
	      cParte:= SubStr(cParte, 1, nIni - 1)  //Pagamento
   	   GeraBlocoPagamento( cParte )
      EndIf

      Return .t.

****************************************
FUNCTION GeraBlocoIde( cParte )
Public cVersao:="", ctpAmb:="", cverAplic:="", cdhRecbto:="", cnProt:="", cdigVal:="", ccStat:="", cxMotivo:=""
Public cinfCpl:="", cinfAdFisco:="", cDiscAdicional:="", cFCI:= '', cIndPag:= ''

   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
   nIni := At( '<legend class="titulo-aba-interna">Informações Adicionais de Interesse do Fisco</legend>', cPar_ )
   IF nIni > 0
      c_span     := SubStr( cPar_, nIni + 88 )
      nIni       := At( '<label>Descrição</label><span>', c_span )
      c_span     := SubStr( c_span, nIni + 30 )
      nIni       := At( '</span>', c_span )
      cInfAdFisco:= 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 HB_AtI( '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
      ElseIf i == 4
       	cIndPag:= c_tag
      ENDIF
   NEXT i
   RETURN NIL

***************************************
FUNCTION GeraBlocoEmit( cParte )

   cPar_ := StrTran( cParte, Chr( 13 ), "" )
   cPar_ := StrTran( cParte, Chr( 10 ), "" )
   cPar_ := StrTran( cPar_, Chr( 160 ), " " )
   FOR i := 1 TO Len( aEmit[ 1 ] )
      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 == 13
            c_tag := '1058'
         ENDIF
         IF i == 14
            c_tag := 'Brasil'
         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

***************************************
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 + 1 ) )
               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

***************************************
FUNCTION GeraBlocoEntrega( cParte )

   FOR i := 1 TO Len( aEntrega[ 1 ] )
      cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
      cPar_ := StrTran( cPar_, Chr( 160 ), "" )
      nIni := At( aEntrega[ 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
            c_tag := StrTran( c_tag, ".", "" )
            c_tag := StrTran( c_tag, "/", "" )
            c_tag := StrTran( c_tag, "-", "" )
         ENDIF
         IF i >= 2 .AND. i <= 3
            nIni := At( ",,", c_tag )
            IF nIni == 0
               nIni := At( ",", c_tag )
            ENDIF
            IF i == 2
               c_tag := Left( c_tag, nIni - 1 )
            ELSEIF i == 3
               c_tag := AllTrim( SubStr( c_tag, nIni + 1 ) )
               nIni := At( " ", c_tag )
               IF nIni > 0
                  c_tag := Left( c_tag, nIni - 1 )
               ENDIF
            ENDIF
         ENDIF
         IF aEntrega[ 1, i, 6 ] != 0
            IF aEntrega[ 1, i, 6 ] > 0
               c_tag := Left( c_tag, aEntrega[ 1, i, 6 ] )
            ELSE
               c_tag := AllTrim( SubStr( c_tag, Abs( aEntrega[ 1, i, 6 ] ) + 1 ) )
               c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
            ENDIF
         ENDIF
         aEntrega[ 1, i, 1 ] := c_tag
      ENDIF
   NEXT i
   RETURN NIL

***************************************
FUNCTION GeraBlocoDet( cParte )
Local nMed, nN:= 1, nCP:= 1

   cPar_ := StrTran(cParte, Chr(10) , "" )
   cPar_ := StrTran(cPar_ , Chr(160), " " )
	cPar_ := StrTran(cPar_ , Chr(13) , "")
	cParT_:= StrTran(cPar_ , Chr(9)  , "")
   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
   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 .And. i != 24
               c_tag := StrTran( c_tag, ".",  "" )
               c_tag := StrTran( c_tag, ",", "." )
            ENDIF
            aDet[ p_, i, 1 ] := c_tag
         ENDIF
      NEXT i

      //Tag 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 i

      //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 := HB_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
            Else
            	If i == 4
           			nIni := At( 'Modalidade Definição da', cPar1_ )
            		If nIni > 0
               		c_span := SubStr( cPar1_, nIni )
               		nIni   := At( '<span>', c_span ) + 6
               		nTamTag:= At( '</span>', c_span ) - nIni
               		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
              			aICMS[ p_, i, 1 ] := c_tag
               	EndIf
               EndIf
               If i == 7
           			nIni := At( 'Alíquota', 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 ) )
               		c_tag := StrTran( c_tag, ".",  "" )
              			c_tag := StrTran( c_tag, ",", "." )
              			aICMS[ p_, i, 1 ] := c_tag
               	EndIf
               EndIf
             	If i == 8
             		nIni := At( 'Valor do ICMS Normal', cPar1_ )
             		If nIni == 0
             			nIni := At( 'Valor<', cPar1_ )
             		EndIf
            		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 ) )
               		c_tag := StrTran( c_tag, ".",  "" )
              			c_tag := StrTran( c_tag, ",", "." )
              			aICMS[ p_, i, 1 ] := c_tag

Consulta optante do simples online

Enviado: 20 Mar 2019 15:03
por Fernando queiroz

Código: Selecionar todos

              	EndIf
               EndIf
               If i == 11
             		nIni := At( 'Modalidade definição da BC ICMS ST', cPar1_ )
            		If nIni > 0
               		c_span := SubStr( cPar1_, nIni )
               		nIni   := At( '<span>', c_span ) + 6
               		nTamTag:= At( '</span>', c_span ) - nIni
               		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
              			aICMS[ p_, i, 1 ] := c_tag
               	EndIf
               EndIf
            	If i == 14
             		nIni := At( 'Base de Cálculo do ICMS ST', 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 ) )
               		c_tag := StrTran( c_tag, ".",  "" )
              			c_tag := StrTran( c_tag, ",", "." )
              			aICMS[ p_, i, 1 ] := c_tag
               	EndIf
               EndIf
               If i == 15
             		nIni := At( 'Alíquota do ICMS ST', cPar1_ )
             		If nIni == 0
             			nIni := At( 'Alíquota', cPar1_ )
             		EndIf
            		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 ) )
               		c_tag := StrTran( c_tag, ".",  "" )
              			c_tag := StrTran( c_tag, ",", "." )
              			aICMS[ p_, i, 1 ] := c_tag
               	EndIf
               EndIf
	            If i == 16
             		nIni := At( 'Valor', 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 ) )
               		aICMS[ p_, i, 1 ] := c_tag
               		c_tag := StrTran( c_tag, ".",  "" )
              			c_tag := StrTran( c_tag, ",", "." )
              			aICMS[ p_, i, 1 ] := c_tag
               	EndIf
               EndIf
            EndIf
         NEXT i
      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 i
      ENDIF

      //Tags Medicamentos
      nIni:= At( '<legend>Rastro</legend>', cPar_ )
      IF nIni > 0
      	cPar1_ := SubStr( cPar_, nIni )
      	FOR i := 1 TO Len( aRastro[ p_ ] )
         	nIni:= At( aRastro[ 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 aRastro[ p_, i, 4 ] != 0
           		   IF aRastro[ p_, i, 4 ] > 0
           	      	c_tag:= Left( c_tag, aRastro[ p_, i, 4 ] )
              	   ELSE
               	   c_tag:= AllTrim( SubStr( c_tag, Abs( aRastro[ 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
           		aRastro[ p_, i, 1 ] := c_tag
  	         ENDIF
     	   NEXT i
      ENDIF
      If cVersao == '3.10'
       nIni:= At( '<legend>Detalhamento específico dos medicamentos</legend>', cPar_ )
   	   IF nIni > 0
      	   cPar1_:= SubStr( cPar_, nIni )
         	nMed  := At( 'Medicamento ' + AllTrim(Str(nN)), cPar1_ )
	         cPar1_:= SubStr( cPar1_, nMed )
			   While .t.
      	   	If nMed > 0
	 	   	   	FOR i := 1 TO Len( aMedLote[ p_ ] )
	 	   	   		If i == 7
            				aMedLote[ nCP, i, 1 ] := p_
            			Else
 		      	   	   nIni := At( aMedLote[ 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 aMedLote[ p_, i, 4 ] != 0
         	   	   		   IF aMedLote[ p_, i, 4 ] > 0
            	   		      	c_tag := Left( c_tag, aMedlote[ p_, i, 4 ] )
	            	   		   ELSE
   	            	   		   c_tag := AllTrim( SubStr( c_tag, Abs( aMedLote[ p_, i, 4 ] ) + 1 ) )
   	   	            	   	c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
		         	         	ENDIF
	   		         	   ENDIF
   	   		         	IF i != 3
      	   		         	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
  	            				aMedLote[ nCP, i, 1 ] := c_tag
  	            			EndIf
	   	         	EndIf
	   	     	   NEXT i
	   	     	   nN++
   		      	nMed  := At( 'Medicamento ' + AllTrim(Str(nN)), cPar1_ )
   		      	cPar1_:= SubStr( cPar1_, nMed )
   		      	If nMed > 0
   		      		aadd(aMedLote, {{"","nLote",'Nro. do Lote', 0},; //1-
                        {"","qLote",'Quantidade de produtos no lote', 0},; //2-
                        {"","dFab",'Data de fabricação', 0},; //3-
                        {"","dVal",'Data de validade', 0},;  //4-
                        {"","vPMC",'Preço Máximo Consumido', 0},; //5-
                        {"","infAdProd",'Descrição', 0},; //6-
                        {"","Controle",'', 0}})
   	   	   	EndIf
   	   	   	nCP++
   	      	Else
        				Exit
   	      	EndIf
   	   	End
	   	   nN:= 1
   	   ENDIF
      Else
	      nIni:= At( '<legend>Detalhamento específico dos medicamentos</legend>', cPar_ )
   	   IF nIni > 0
      	   cPar1_:= SubStr( cPar_, nIni )
         	nMed  := At( 'Medicamento ' + AllTrim(Str(nN)), cPar1_ )
	         cPar1_:= SubStr( cPar1_, nMed )
			   While .t.
      	   	If nMed > 0
	 	   	   	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 != 3
      	   	         	c_tag := StrTran( c_tag, ".",  "" )
	      	   	         c_tag := StrTran( c_tag, ",", "." )
   	      	   	   ENDIF
  	            			aMedicamentos[ p_, i, 1 ] := c_tag
	   	         	ENDIF
	   	     	   NEXT i
   		      	nMed  := At( 'Medicamento ' + AllTrim(Str(nN)), cPar1_ )
   		      	cPar1_:= SubStr( cPar1_, nMed )
   	   	   	nN++
   	      	Else
        				Exit
   	      	EndIf
   	   	End
	   	   nN:= 1
   	   ENDIF
   	EndIf
	   If p_ < Len( aDet )
   	  		nIni:= At('<td class="fixo-prod-serv-numero"><span>' + AllTrim( Str( aItensNota[p_+1] ) ), cParT_ )
      Else
      	nIni:= At('<td class="fixo-prod-serv-numero"><span>' + AllTrim( Str( aItensNota[p_] ) ), cParT_ )
      EndIf
      cParT_:= SubStr(cParT_, (nIni + 40))
      nFim  := At('<td class="fixo-prod-serv-numero"><span>', cParT_ )
      IF nFim <= 0
         cPar_:= SubStr( cParT_, 1 )
      ELSE
         cPar_:= SubStr( cParT_, 1, nFim )
      ENDIF
   NEXT p_
   RETURN NIL

***************************************
FUNCTION GeraBlocoIcmsPart( cParte )

   FOR i := 1 TO Len( aIcmsPart[ 1 ] )
      cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
      cPar_ := StrTran( cPar_, Chr( 160 ), "" )
      nIni := At( aIcmsPart[ 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, ",", "." )
         aIcmsPart[ 1, i, 1 ] := c_tag
      ENDIF
   NEXT i
   RETURN NIL

***************************************
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

***************************************
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
         IF i == 12 .Or. i == 16 .Or. i == 17
         	If Empty(c_tag)
         	   c_Tag:= '0,000'
         	EndIf
            c_tag := StrTran( c_tag, ".",  "" )
            c_tag := StrTran( c_tag, ",", "." )
         ENDIF
         aTransp[ 1, i, 1 ] := c_tag
      ENDIF
   NEXT i
   RETURN NIL

***************************************
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

***************************************
FUNCTION GeraBlocoFat( cParte )

   cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
   cPar_ := StrTran( cPar_, Chr( 160 ), "" )
   FOR i := 1 TO Len( aFat[ 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, ",", "." )
         aFat[ 1, i, 1 ] := c_tag
      ELSE
         EXIT
      ENDIF
   NEXT i
   RETURN NIL

***************************************
FUNCTION GeraBlocoPagamento( cParte )

   cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
   cPar_ := StrTran( cPar_, Chr( 160 ), "" )
   FOR i := 1 TO Len( aPagamento[ 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 ) )
         IF aPagamento[ 1, i, 4 ] != 0
            IF aPagamento[ 1, i, 4 ] > 0
               c_tag := Left( c_tag, aPagamento[ 1, i, 4 ] )
            ELSE
               c_tag := AllTrim( SubStr( c_tag, Abs( aPagamento[ 1, i, 4 ] ) + 1 ) )
               c_tag := AllTrim( StrTran( c_tag, "-", "" ) )
            ENDIF
         ENDIF
         c_tag  := StrTran( c_tag, ".", "" )
         c_tag  := StrTran( c_tag, ",", "." )
         aPagamento[ 1, i, 1 ] := c_tag
      ELSE
         EXIT
      ENDIF
   NEXT i
   RETURN NIL

***************************************
FUNCTION GeraBlocoCompra( cParte )

   cPar_ := StrTran( cParte, Chr( 13 ) + Chr( 10 ), "" )
   cPar_ := StrTran( cPar_, Chr( 160 ), "" )
   FOR i := 1 TO Len( aCompra[ 1 ] )
   	nIni := At( aCompra[ 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 ) )
         aCompra[ 1, i, 1 ] := c_tag
      ELSE
         EXIT
      ENDIF
   NEXT i
   RETURN NIL

***************************************************
Function GravaXML()
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+'">'
Local lTagFim := .f., a, x

	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 i:= 1 To Len(aEntrega[1])
  		If ! Empty(aEntrega[1,i,1])
    		nFimTagPai:= aEntrega[1,i,4]
    		cTagPai+="|"+StrZero(nFimTagPai,2)+aEntrega[1,i,3]
    		cXML   +='<'+aEntrega[1,i,3]+'>'
  		EndIf
  		If !Empty(aEntrega[1,i,1])
    		cXML+= '<'+aEntrega[1,i,2]+'>'+aEntrega[1,i,1]+'</'+aEntrega[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(aItensNota[p_]))+'"><prod>'
  		cFCI:= cDiscAdicional:= ''
  		For i:= 1 To Len(aDet[p_])
    		If ! Empty(aDet[p_, i, 1])
    			If i == 24
	           	cDiscAdicional:= '<'+aDet[p_,i,2]+'>'+aDet[p_,i,1]+'</'+aDet[p_,i,2]+'>'
		      Else
      	     	cXML+= '<'+aDet[p_,i,2]+'>'+aDet[p_,i,1]+'</'+aDet[p_,i,2]+'>'
         	EndIf
         Else
         	If i == 2 .Or. i == 13
         		cXML+= '<' + aDet[p_, i, 2] + '/>'
         	EndIf
   	 	EndIf
  		Next
  		lpoemTag:= .F.

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

		lpoemTag:= .f.
  		For i:= 1 To Len(aMedicamentos[p_])
    		If i == 1
      		If ! Empty(aMedicamentos[p_,i,1])
      			cXML+= '<med><' + aMedicamentos[p_,i,2] + '>' + aMedicamentos[p_, i, 1] + '</' + aMedicamentos[p_,i,2] + '>'
	        		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
  		If cVersao == '3.10'
			For a:= 1 To Len(aMedLote)
//			msginfo(aMedLote[ a, 7, 1 ])
			   If aMedLote[ a, 7, 1 ] == p_
  		   		For x:= 1 To 6
  		   			If x == 1
      					cXML+= '<med><nLote>' + aMedLote[a, x, 1] + '</nLote>'
	      	   	Else
   	   	   		cXML+='<'+aMedLote[a,x,2]+'>'+ aMedLote[a,x,1] + '</'+aMedLote[a,x,2]+'>'
      		   	EndIf
		   		next x
		   		cXML+='</med>'
			   EndIf
      	Next a
      EndIf
  		cXML+= '</prod><imposto>'
		For i:= 1 To Len(aTrib[p_])
  			If Val(aTrib[p_,i,1]) > 0
  				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"
      	      	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
      			IF aICMS[ p_, i, 4 ] != 0
	         		cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
	         	Else
	         		If Val(aICMS[p_, i, 1]) > 0
	         			cXml+= '<' + aICMS[p_, i, 2] + '>' + aICMS[p_, i, 1] + '</' + aICMS[p_, i, 2] + '>'
	         		EndIf
	         	EndIf
   	   	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])
      		   If aIPI[p_,2,1] == '00' .Or. aIPI[p_,2,1]  == '49' .Or. aIPI[p_,2,1] == '50' .Or. aIPI[p_,2,1] == '99'
        			   cXML+= '<IPI><cEnq>' + aIPI[p_,i,1] + '</cEnq><IPITrib>'
        			Else
        			   cXML+= '<IPI><cEnq>' + aIPI[p_,i,1] + '</cEnq><IPINT>'
        			EndIf
	        		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
  			If aIPI[p_,2,1] == '00' .Or. aIPI[p_,2,1]  == '49' .Or. aIPI[p_,2,1] == '50' .Or. aIPI[p_,2,1] == '99'
    			cXML+='</IPITrib></IPI>'
    		Else
    			cXML+='</IPINT></IPI>'
    		EndIf
  		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])
	      	If Val(aPIS[p_, 1, 1]) == 1 .Or. Val(aPIS[p_, 1, 1]) == 2
         	 	If StrZero(i, 1) $ "-01-02-03-04"
            		cXML+= '<' + aPIS[p_,i,2] + '>' + aPIS[p_,i,1] + '</' + aPIS[p_,i,2] + '>'
         		EndIf
         	ElseIf Val(aPIS[p_, 1, 1]) == 3
         	 	If StrZero(i, 1) $ "-01-04-06-05"
            		cXML+= '<' + aPIS[p_,i,2] + '>' + aPIS[p_,i,1] + '</' + aPIS[p_,i,2] + '>'
         		EndIf
         	ElseIf Val(aPIS[p_, 1, 1]) >= 4 .And. Val(aPIS[p_, 1, 1]) <= 9
         	 	If StrZero(i, 1) $ "-01"
            		cXML+= '<' + aPIS[p_,i,2] + '>' + aPIS[p_,i,1] + '</' + aPIS[p_,i,2] + '>'
         		EndIf
         	ElseIf Val(aPIS[p_, 1, 1]) >= 9 .And. Val(aPIS[p_, 1, 1]) <= 99
         	 	If StrZero(i, 1) $ "-01-02-03-04-05-06"
            		cXML+= '<' + aPIS[p_,i,2] + '>' + aPIS[p_,i,1] + '</' + aPIS[p_,i,2] + '>'
         		EndIf
     			Else
     			   If StrZero(i, 1) $ "-02-03-04-05-06"
     			   	cXML+= '<' + aPIS[p_,i,2] + '>' + aPIS[p_,i,1] + '</' + aPIS[p_,i,2] + '>'
     			   EndIf
     			EndIf
  			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(aCOFINS[p_, 1, 1]) >= 1 .And. Val(aCOFINS[p_, 1, 1]) <= 2
           			cXML+= '<COFINS><COFINSAliq>'
         		ElseIf Val(aCOFINS[p_, 1, 1]) == 3
            		cXML+= '<COFINS><COFINSQte>'
         		ElseIf Val(aCOFINS[p_, 1, 1]) >= 4 .And. Val(aCOFINS[p_, 1, 1]) <= 9
          			cXML+= '<COFINS><COFINSNT>'
         		ElseIf Val(aCOFINS[p_, 1, 1]) >= 49 .And. Val(aCOFINS[p_, 1, 1]) <= 99
           			cXML+= '<COFINS><COFINSOutr>'
          		EndIf
        			lpoemTag:=.T.
      		EndIf
    		EndIf
  			If !Empty(aCOFINS[p_, i, 1])
  				If Val(aCOFINS[p_, 1, 1]) == 1 .Or. Val(aCOFINS[p_, 1, 1]) == 2
         	 	If StrZero(i, 1) $ "-01-02-03-04"
            		cXML+= '<' + aCOFINS[p_, i, 2] + '>' + aCOFINS[p_, i, 1] + '</' + aCOFINS[p_, i, 2] + '>'
         		EndIf
         	ElseIf Val(aCOFINS[p_, 1, 1]) == 3
         	 	If StrZero(i, 1) $ "-01-04-06-05"
            		cXML+= '<' + aCOFINS[p_, i, 2] + '>' + aCOFINS[p_, i, 1] + '</' + aCOFINS[p_, i, 2] + '>'
         		EndIf
         	ElseIf Val(aCOFINS[p_, 1, 1]) >= 4 .And. Val(aCOFINS[p_, 1, 1]) <= 9
         	 	If StrZero(i, 1) $ "-01"
            		cXML+= '<' + aCOFINS[p_, i, 2] + '>' + aCOFINS[p_, i, 1] + '</' + aCOFINS[p_, i, 2] + '>'
         		EndIf
         	ElseIf Val(aCOFINS[p_, 1, 1]) >= 9 .And. Val(aCOFINS[p_, 1, 1]) <= 99
         	 	If StrZero(i, 1) $ "-01-02-03-04-05-06"
            		cXML+= '<' + aCOFINS[p_, i, 2] + '>' + aCOFINS[p_, i, 1] + '</' + aCOFINS[p_, i, 2] + '>'
         		EndIf
     			Else
     				If StrZero(i, 1) $ "-02-03-04-05-06"
     			   	cXML+= '<' + aCOFINS[p_, i, 2] + '>' + aCOFINS[p_, i, 1] + '</' + aCOFINS[p_, i, 2] + '>'
     			   EndIf
     			EndIf
  			EndIf
  		Next i
  		If lpoemTag
    		If Val(aCOFINS[p_, 1, 1]) >= 1 .And. Val(aCOFINS[p_, 1, 1]) <= 2
           	cXML+= '</COFINSAliq></COFINS>'
         ElseIf Val(aCOFINS[p_, 1, 1]) == 3
            cXML+= '</COFINSQte></COFINS>'
         ElseIf Val(aCOFINS[p_, 1, 1]) >= 4 .And. Val(aCOFINS[p_, 1, 1]) <= 9
          	cXML+= '</COFINSNT></COFINS>'
         ElseIf Val(aCOFINS[p_, 1, 1]) >= 49 .And. Val(aCOFINS[p_, 1, 1]) <= 99
         	cXML+= '</COFINSOutr></COFINS>'
         EndIf
  		EndIf

  		If Val(aIcmsPart[1,1,1]) > 0
  			cXML+='<ICMSUFDest>'
			For i:= 1 To Len(aIcmsPart[1])
  				If !Empty(aIcmsPart[1,i,1])
    				cXML+= '<'+aIcmsPart[1,i,2]+'>'+aIcmsPart[1,i,1]+'</'+aIcmsPart[1,i,2]+'>'
  				EndIf
			Next i
			cXML+= '</ICMSUFDest>'
  		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])
  			If !Empty(aTransp[1,i,1])
    			nFimTagPai:= aTransp[1,i,4]
    			cTagPai+= "|"+StrZero(nFimTagPai,2) + aTransp[1,i,3]
    			cXML+= '<' + aTransp[1,i,3] + '>'
    			lpoemTag:= .t.
    			lTagFim := .t.
    		Else
    			lpoemTag:= .f.
    		EndIf
  		EndIf
  		If ! Empty(aTransp[1,i,1])
    		cXML+= '<'+aTransp[1,i,2]+'>'+aTransp[1,i,1]+'</'+aTransp[1,i,2]+'>'
  		EndIf
  		If i == nFimTagPai .And. lpoemTag
    		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
 	If lTagFim
   	cXML+= '</transp>'
  	EndIf

	lpoemTag:= .f.
	If ! Empty(aFat[1,1,1])
  		cXML+= '<cobr>'
  		For i:= 1 To Len(aFat[1])
    		If ! Empty(aFat[1,i,1])
      		If StrZero(i,2) $ "-01-05-09-13-17-21-25-29"
        			If i > 2
          			cXML+= '</fat>'
        			EndIf
        			cXML+= '<fat>'
      		EndIf
      		cXML+= '<'+aFat[1,i,2]+'>'+aFat[1,i,1]+'</'+aFat[1,i,2]+'>'
    		EndIf
  		Next
  		cXML+= '</fat>'
  		lpoemTag:= .t.
	EndIf

	If ! Empty(aCobr[1,1,1])
		If ! lpoemTag
  			cXML+= '<cobr>'
  		EndIf
  		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]+'>'
      		lpoemTag:= .t.
    		EndIf
  		Next
  		cXML+= '</dup>'
	EndIf
	If lpoemTag
		cXML+= '</cobr>'
	EndIf

   lpoemTag:= .f.
	If ! Empty(aPagamento[1,1,1])
		cXML+= '<pag>'
  		For i:= 1 To Len(aPagamento[1])
    		If ! Empty(aPagamento[1,i,1])
    			If i == 1
     				cXML+= '<detPag>'
     				If ! Empty(cIndPag)
     					cXML+= '<indPag>' + cIndPag + '</indPag>'
     				EndIf
     			EndIf
      		cXML+= '<'+aPagamento[1,i,2]+'>'+aPagamento[1,i,1]+'</'+aPagamento[1,i,2]+'>'
      		lpoemTag:= .t.
    		EndIf
  		Next i
  		cXML+= '</detPag>'
	EndIf
	If lpoemTag
		cXML+= '</pag>'
	EndIf

	If ! Empty(cinfCpl) .or. ! Empty(cinfAdFisco)
  		cXML+= '<infAdic>'
  		If ! Empty(cinfAdFisco)
    		cXML+= '<infAdFisco>' + cinfAdFisco + '</infAdFisco>'
  		EndIf
  		If ! Empty(cinfCpl)
    		cXML+= '<infCpl>' + cinfCpl + '</infCpl>'
  		EndIf
  		cXML+= '</infAdic>'
	EndIf

	If ! Empty(aCompra[1, 1, 1])
		cXML+= '<compra>'
		For i:= 1 To Len(aCompra[1])
   		If ! Empty(aCompra[1,i,1])
  				cXML+= '<'+aCompra[1,i,2]+'>'+aCompra[1,i,1]+'</'+aCompra[1,i,2]+'>'
  			Endif
		Next i
		cXML+= '</compra>'
  	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>N6srMqFYv/CIChjx+BEqcBf8qrh0KR1bn2uKBe6h51SaZw+SN3oUVKww/GmWi7iMgKkYMKgVz9QzT0Ooviw8a6WFENTHbABxMfg3UhJeFrvM+4Z75M5WTXEH6TuEi+BYodv44zNCn0utIkdGngvIEmB86KFJRnDCm+u1hrYHcNA=</SignatureValue>'
    cXML+= '<KeyInfo><X509Data><X509Certificate>MIICOTCCAaKgAwIBAgIQJpLn3fwH17RNXJHw5VenaDANBgkqhkiG9w0BAQUFADBbMVkwVwYDVQQDHlAAdwB3AHcALgBmAHMAaQBzAHQALgBjAG8AbQAuAGIAcgAgACgAUwBFAE0AIABWAEEATABJAEQAQQBEAEUAIABKAFUAUgDNAEQASQBDAEEAKTAeFw0xNTEyMjQwODI1MjVaFw0xODEyMjQwODI1MjVaMFsxWTBXBgNVBAMeUAB3AHcAdwAuAGYAcwBpAHMAdAAuAGMAbwBtAC4AYgByACAAKABTAEUATQAgAFYAQQBMAEkARABBAEQARQAgAEoAVQBSAM0ARABJAEMAQQApMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDX4BYmJiNwrPz9At2ioXYkMuMWAOf669VPS3SAzIKkJLhSE7Bf9sbTjGHRFZhs6STxKkMBKKnx6dqAEMGlQwDSU42/kqhGya28SUn3HigH2w3dR/536Gt4eAxyLp9ODNXUqWTpnraWCeT41kcnJ27cmOAUMxzxDcsA93n32L4u8wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAAN89zf+wSFL+4+2Ic8mGva8Z51EzYzNgYEqXwEMHxw4jCxxbsuxewQWedSGWi3SFZla6zmNUEA+UO95tSZ353klTvWDzut2BFSJOPLcMu8HPTTdnMt4ofVeVqKyi2vp+3t78vjqDAAfSAu5C9wT7stoUx41Nok+L6WbmpOIgvHy</X509Certificate>'
    cXML+= '</X509Data></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:= "C:\TEMP\" + cChave + ".xml"

	nArqHandle:= FCREATE(cArqXml, 0 )
	FWRITE(nArqHandle, cXML)
	FCLOSE(nArqHandle)
	If ! File(cArqXml)
		hwg_msginfo("XML não foi Criado!")
		Return Nil
	Else
		hwg_msginfo("XML criado com sucesso!")
	EndIf

	Return Nil

***************************************
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....', 'Aviso do Sistema')
      principal:oChaveNFe:SetFocus()
      Return .f.
   EndIf
	Return .t.

***************************************
Function Troca_Acento(cTexto)

   cTexto := StrTran( cTexto, "ó", "ó" )
   cTexto := StrTran( cTexto, "á", "á" )
   cTexto := StrTran( cTexto, "é", "é" )
	Return cTexto



**************************************
Function Transfome(cTexto)

   cTexto := StrTran( cTexto, "/", "%2F" )
   cTexto := StrTran( cTexto, "=", "%3D" )
   cTexto := StrTran( cTexto, "+", "%2B" )
   cTexto := StrTran( cTexto, ":", "%3A" )
   cTexto := StrTran( cTexto, ",", "%2C" )
   cTexto := StrTran( cTexto, "?", "%3F" )
   cTexto := StrTran( cTexto, "$", "%24" )

	Return cTexto
rotina em HWGUI completa :xau :xau :xau

Consulta optante do simples online

Enviado: 27 Mar 2019 16:37
por fladimir
Agradeço aos colegas q implentaram ou melhoraram a função em especial ao Daniel, mas o fato é q estou tendo problemas e pelo q pesquisei o governo quer limitar o download a ter o certificado ou via manifestação prévia.

Eu tenha as 2 formas em meu sistema via a rotina aki descrita e tb via manifestação.

Via manifestação o problema é q demora a sincronização no site do governo ou seja, manifesta como confirmação da operação e pra liberar o download demora de 30 segundos até uns 3 min e o cliente quer tudo na hora.

Tem alguns sites como o FSIST q vc informa a chave e escolhe com certificado ai pede o certificado e já baixa o XML.

Se fosse possível modificar esta rotina aki pra incorporar o certificado ou algo assim ai daria certo sem ter q manifestar, ou seja, seria mais rápido.

Será q seria possível?

Consulta optante do simples online

Enviado: 27 Mar 2019 20:06
por janio
Se fosse possível modificar esta rotina aki pra incorporar o certificado
Show, Fladimir. Acho q eh isso mesmo que precisamos no momento, como forma de contornar esse problema que o governo está criando pra nós.

Eu lembro que ha alguns anos havia duas versões desta rotina: uma com certificado, e a outra (esta que estamos usando até hoje) sem certificado.

Vamos aguardar o que os mestres tem a dizer

PS: Se tiro a baixa de xml do meu sistema, me matam rsrs

Consulta optante do simples online

Enviado: 28 Mar 2019 14:10
por Daniel
Ola
Para teste com uso do certificado

Consulta optante do simples online

Enviado: 28 Mar 2019 15:12
por fladimir
Cara... deu certo...
Daniel meu amigo, vou entrar em contato contigo no particular, vou mandar um presente pra vc...

Kkk
Parabéns cara vc manja muito de Web e esses negócios.

Só 1 dúvida, qdo abriu apareceu os diversos certificados, mesmo eu tendo marcado o correto não baixou, ai removi e deixei somente o correto, ai executando deu certo, seria isso mesmo?
De qualquer maneira tem o fonte, vou dar uma analisada mais apurada.

Grande abraço e obrigado mais 1 vez... não precisa nem manifestar e não esta errado pq usou o certificado do cliente, agora se o governo não mudar (o q é meio dificil) vai funcionar por mais um bom tempo

Consulta optante do simples online

Enviado: 28 Mar 2019 17:31
por Daniel
Ola Fladimir
Testar com esta mudança na função abaixo
com mais de um certificado

Código: Selecionar todos

*****************************************
Function DownLoad()
Local cParm, cRet, cPart, cCertificado:= SubStr(principal.Combo_1.DisplayValue, (At(' - ', principal.Combo_1.DisplayValue) + 3))
Local cXML

	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)

	cParm:= "__EVENTTARGET=" + ;
           "&__EVENTARGUMENT=" + ;
           "&__VIEWSTATE=" + Transfome(cviewState) + ;
           "&__VIEWSTATEGENERATOR=" + Transfome(cViewStateGenerator) + ;
           "&__EVENTVALIDATION=" + Transfome(cEeventValidation) + ;
 			  "&ctl00%24txtPalavraChave=" + ;
           "&ctl00%24ContentPlaceHolder1%24btnDownload=Download+do+documento*" + ;
           "&ctl00%24ContentPlaceHolder1%24abaSelecionada=" + ;
           "&hiddenInputToUpdateATBuffer_CommonToolkitScripts=1"

   Try
      oServer:= win_OleCreateObject( "MSXML2.ServerXMLHTTP.6.0")
   Catch
		MsgInfo('Erro na Criação do Serviço')
		Return .f.
	End
	Try
		If cCertificado != NIL
   		oServer:setOption( 3, "CURRENT_USER\MY\" + cCertificado )
      EndIf
      oServer:Open( "POST", cUrl2, .f. )
   Catch
		MsgInfo('Erro na Conexão com o Site ' + cUrl2)
		Return .f.
	End
  	oServer:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
   oServer:SetRequestHeader( "Connection", "keep-alive" )
   oServer:SetRequestHeader( "Cookie", cStringCookie)
  	Try
   	oServer:Send(cParm)
      oServer:WaitForResponse( 500000 )
   Catch
		MsgInfo('Erro na Resposta com o Site ' + cUrl2)
		Return .f.
	End
   cRet:= oServer:ResponseBody
   //MemoWrit("texte-nfe.txt", cRet)

   If At('<div id="ctl00_ContentPlaceHolder1_pnlErro" class="painel_alerta">', cRet) > 0
   	cPart:= Substr(cRet, (At('<span id="ctl00_ContentPlaceHolder1_lblResultadoConsulta">', cRet) + 60))
      cPart:= Substr(cPart, 1, (At('</span>', cPart) - 1))
      MsgInfo(Troca_Acento(cPart, 'aviso Erro'))
      Return .f.
   EndIf
   If At('<div id="ctl00_ContentPlaceHolder1_pnlErro" class="painel_erro_sistema">', cRet) > 0
   	cPart:= Substr(cRet, (At('<span id="ctl00_ContentPlaceHolder1_lblResultadoConsulta">', cRet) + 60))
      cPart:= Substr(cPart, 1, (At('</span>', cPart) - 1))
      MsgInfo(Troca_Acento(cPart, 'aviso Erro'))
      Return .f.
   EndIf
   If At('<div class="divMensagemPaginaErro">', cRet) > 0
      cPart:= Substr(cRet, (At('<span id="ctl00_ContentPlaceHolder1_lblMensagemErro">', cRet) + 53))
      cPart:= Substr(cPart, 1, (At('</span>', cPart) - 1))
      MsgInfo(Troca_Acento(cPart, 'aviso Erro'))
      Return .f.
   EndIf
   cIniFolder:= DiskName() + ":\" + CurDir() + "\"
	cXML:= cIniFolder + '\' + cChave + "-nfe_Cert.xml"
   nArqHandle:= FCREATE(cXML, 0 )
	FWRITE(nArqHandle, cRet)
	FCLOSE(nArqHandle)
	If ! File(cXML)
		MsgInfo("xML não baixado!")
		Return .f.
	Else
		MsgInfo("xML baixado com sucesso!")
		If MsgYesNo('Gerar DANFE?')
			cXML:= MemoRead(cXML)
  			ImprimeDanfe(cXML, cChave + '.pdf')
  		EndIf
	EndIf
   Return .t.

Consulta optante do simples online

Enviado: 28 Mar 2019 18:32
por janio
Boa noite,

Não consegui fazer funcionar. Mesmo na versão compilada não funcionou!

Janio

Consulta optante do simples online

Enviado: 28 Mar 2019 21:09
por fladimir
Deixa um certificado só na opções de internet

Consulta optante do simples online

Enviado: 29 Mar 2019 09:00
por rubens
Bom dia...

Daniel ainda não baixei essa versão nova aí, mas na versão anterior se digitasse o captcha errado dava erro e saía do sistema.. Já que você tá fazendo estas alterações aí poderia dar uma olhada nesse erro ...

Obrigado
Rubens

Consulta optante do simples online

Enviado: 29 Mar 2019 09:36
por fladimir
O Rubens, coloca um TRY CATCH nessa parte q ai não sai

Consulta optante do simples online

Enviado: 29 Mar 2019 11:13
por Daniel
ola Rubens nesta ultima foi arrumado o erro

Consulta optante do simples online

Enviado: 30 Mar 2019 15:46
por janio
Tudo funcionando! Vlw Daniel

Janio

Consulta optante do simples online

Enviado: 29 Abr 2019 03:40
por Sistem
olá,
acho que a SEFAZ bloqueou o captcha, desde de quinta feira não mostra o captcha (A seguinte falha ocorreu: Falha inesperada. O sistema pode estar momentaneamente indisponível ou ocorreu um erro pontual.) ver link abaixo.
o site do fsist não trabalha bem também
https://www.nfe.fazenda.gov.br/portal/c ... SeqxE8pl8=