crisvam Posted June 29, 2017 Report Share Posted June 29, 2017 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?) Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 19, 2017 Report Share Posted September 19, 2017 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. Quote Link to comment Share on other sites More sharing options...
Wellington Vieira Posted September 19, 2017 Report Share Posted September 19, 2017 Boa Noite, Oscar Ribeiro, Você poderia postar o código completo por favor? No meu prg, da a mensagem: "Erro de criacao do arquivo de imagem", que esta na funcão: Function AtualizaImagem() Obrigado. Wellington Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 20, 2017 Report Share Posted September 20, 2017 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, "ó", "ó" ) cTexto := StrTran( cTexto, "á", "á" ) 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() * *************************************************** Quote Link to comment Share on other sites More sharing options...
kapiaba Posted September 20, 2017 Report Share Posted September 20, 2017 Oscar, onde você pegou esse código? Eu também não tenho este .prg. Tenho o do Alessandro. abs. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 20, 2017 Report Share Posted September 20, 2017 Foi aqui, nesse tópico. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted September 20, 2017 Report Share Posted September 20, 2017 Oscar, poste o .RC deste dialogo porfa: define dialog principal resource "nfebxxml" title Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 20, 2017 Report Share Posted September 20, 2017 Nāo estou no escritório, mas você pode baixar no link do Aferra nas primeiras páginas desse mesmo tópico. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
miragerr Posted September 20, 2017 Report Share Posted September 20, 2017 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. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted September 20, 2017 Report Share Posted September 20, 2017 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 Quote Link to comment Share on other sites More sharing options...
miragerr Posted September 20, 2017 Report Share Posted September 20, 2017 Ola amigo Sim houve mudanças, e posso lhe dizer que foi para melhor, agora você pode até controlar o numero de NSU que você quer baixar, pois agora é retornado os últimos 3 meses. Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted September 20, 2017 Report Share Posted September 20, 2017 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, Valdir 1 Quote Link to comment Share on other sites More sharing options...
Valdir Posted September 20, 2017 Report Share Posted September 20, 2017 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. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 20, 2017 Report Share Posted September 20, 2017 Valdir, muito obrigado pelo alerta. Eu estou utilizando somente para fazer entrada automática no estoque e no contas a pagar. Antes o usuário precisava digitar produto a produto no estoque, agora ele faz a entrada automática através do arquivo XML ou da chave. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted September 20, 2017 Report Share Posted September 20, 2017 Modelo do Oscar, compilado e testado. https://www.4shared.com/rar/bzPGhLq7ei/NFEBAIXA.html Many thanks Oscar. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted September 20, 2017 Report Share Posted September 20, 2017 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. Quote Link to comment Share on other sites More sharing options...
oribeiro Posted September 20, 2017 Report Share Posted September 20, 2017 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? Quote Link to comment Share on other sites More sharing options...
sistem Posted September 20, 2017 Report Share Posted September 20, 2017 Ola Uso a DLL da Fsist para baixar o XML Individual(muito bom)... agora essa opção da Flexdocs de baixar por CNPJ seria de grande ajuda. alguém teria o link da Flexdocs para esse propósito []s Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted September 20, 2017 Report Share Posted September 20, 2017 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, kapiaba 1 Quote Link to comment Share on other sites More sharing options...
sistem Posted September 20, 2017 Report Share Posted September 20, 2017 Ola Uso a DLL da Fsist para baixar o XML Individual(muito bom)... agora essa opção da Flexdocs de baixar por CNPJ seria de grande ajuda. alguém teria o link da Flexdocs para esse propósito []s verificando isto: http://www.flexdocs.com.br/guiaNFe/WS.consultaNFDest.html Jorge Andrade 1 Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted September 20, 2017 Report Share Posted September 20, 2017 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. Jorge Andrade 1 Quote Link to comment Share on other sites More sharing options...
oribeiro Posted October 6, 2017 Report Share Posted October 6, 2017 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. Quote Link to comment Share on other sites More sharing options...
SISTEMASIT Posted October 6, 2017 Report Share Posted October 6, 2017 A função TIPClientHTTP ta travando o Sistema, o que pode ser? temp.bmp Quote Link to comment Share on other sites More sharing options...
sistem Posted October 10, 2017 Report Share Posted October 10, 2017 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' Quote Link to comment Share on other sites More sharing options...
marcioe Posted October 24, 2017 Report Share Posted October 24, 2017 Pessoal a Receita mudou a forma de gerar o captcha Tem alguma atualização do PRG para postar http://ap.imagensbrasil.org/image/d0Xi45 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.