Montei meu monitorzinho com código bem didático(café com leite).
Como uso no Fivewin:
Código: Selecionar todos
...
DEFINE MSGITEM oMsgItemCFaz OF oWnd:oMsgBar SIZE 24 BITMAPS "level2" TOOLTIP "Informa SEFAZ status"
DEFINE TIMER oTimer OF oWnd INTERVAL 20000 ACTION ( SefazStatus(oMsgItemCFaz) ) // Checa status SEFAZ
ACTIVATE TIMER oTimer
...
Através de INI configuro a UF alvo.
Salvo o resultado do status em INI para serem visualizado por maquinas na rede.
A função detecta o status e traz a cor da situação modificando o visual da barra de status.
Conteúdo para um .RC(pode ser acrescentado a qualquer .RC do seu sistema):
Código: Selecionar todos
level1 BITMAP "imagens/level1.bmp"
level2 BITMAP "imagens/level2.bmp"
level3 BITMAP "imagens/level3.bmp"
level1.bmp(bolinha verde), level2.bmp(bolinha vermelha), level3(bolinha amarela)
Funcões:
Código: Selecionar todos
FUNCTION SefazStatus( _bar_, lFazTeste )
default lFazTeste := .f.
#translate _InternetExplorer() => /* win_ole */ CreateObject( "InternetExplorer.Application" )
#translate _MicrosoftXMLHTTP() => /* win_ole */ CreateObject( "Microsoft.XMLHTTP" )
#translate _MSXML2ServerXMLHTTP() => /* win_ole */ CreateObject( "MSXML2.ServerXMLHTTP" )
#translate _XMLHttpRequest() => /* win_ole */ CreateObject( "Microsoft.XMLHTTP" )
#translate _WinHttpRequest() => /* win_ole */ CreateObject( "WinHttp.WinHttpRequest.5.1" )
#translate _MicrosoftXMLDOM() => /* win_ole */ CreateObject( "Microsoft.XMLDOM" )
cEanApi := "https://www.nfe.fazenda.gov.br/portal/disponibilidade.aspx"
SysWait(5)
cPathRaiz := cPathDados
if lFazTeste
cXMLSedex := []
cXMLSedex := cXMLSedex + [<html>]
cXMLSedex := cXMLSedex + [<table class="tabelaListagemDados" cellspacing="0" rules="all" border="1" id="ctl00_ContentPlaceHolder1_gdvDisponibilidade2">]
cXMLSedex := cXMLSedex + [ <caption>]
cXMLSedex := cXMLSedex + [ Visão Geral de Disponibilidade dos Serviços<br/><span class='fonte10'> - Última Verificação: 27/07/2024 18:29:28<br/><br/> - WebServices Versão 4.00</span>]
cXMLSedex := cXMLSedex + [ </caption><tr>]
cXMLSedex := cXMLSedex + [ <th scope="col">Autorizador</th><th scope="col">Autorização4</th><th scope="col">Retorno Autorização4</th><th scope="col">Inutilização4</th><th scope="col">Consulta Protocolo4</th><th scope="col">Status Serviço4</th><th scope="col">Tempo Médio</th><th scope="col">Consulta Cadastro4</th><th scope="col">Recepção Evento4</th>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaImparCentralizada">]
cXMLSedex := cXMLSedex + [ <td>AM</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaParCentralizada">]
cXMLSedex := cXMLSedex + [ <td>BA</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaImparCentralizada">]
cXMLSedex := cXMLSedex + [ <td>GO</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaParCentralizada">]
cXMLSedex := cXMLSedex + [ <td>MG</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaImparCentralizada">]
cXMLSedex := cXMLSedex + [ <td>MS</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaParCentralizada">]
cXMLSedex := cXMLSedex + [ <td>MT</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaImparCentralizada">]
cXMLSedex := cXMLSedex + [ <td>PE</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaParCentralizada">]
cXMLSedex := cXMLSedex + [ <td>PR</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_amarela_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_vermelho_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaImparCentralizada">]
cXMLSedex := cXMLSedex + [ <td>RS</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaParCentralizada">]
cXMLSedex := cXMLSedex + [ <td>SP</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_amarela_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_vermelho_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaImparCentralizada">]
cXMLSedex := cXMLSedex + [ <td>SVAN</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaParCentralizada">]
cXMLSedex := cXMLSedex + [ <td>SVRS</td> <td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaImparCentralizada">]
cXMLSedex := cXMLSedex + [ <td>SVC-AN</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr><tr class="linhaParCentralizada">]
cXMLSedex := cXMLSedex + [ <td>SVC-RS</td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td><td><img src="imagens/bola_verde_P.png" /></td><td>-</td><td><span></span></td><td><img src="imagens/bola_verde_P.png" /></td>]
cXMLSedex := cXMLSedex + [ </tr>]
cXMLSedex := cXMLSedex + [</table>]
cXMLSedex := cXMLSedex + [</html>]
else
cXMLSedex := "" // Esvazia para pegar novo conteudo
oPg := _XMLHttpRequest() // TOLEAuto():New("Microsoft.XMLHTTP")
if oPg = nil
return nil
end
oPg:Open( "GET", cEanApi, .F. )
oPg:Send()
cXMLSedex := oPg:ResponseText // oPg:ResponseXML:xml
rMemoWrit( cPathDados + "\SEFAZ-"+charRem(":-/",time())+".STS", cXMLSedex )
endif
// TOleAuto() no Harbour e CreateObject() no xHarbour
if empty(cXMLSedex)
lSuccess := .f.
else
oXMLDoc := _MicrosoftXMLDOM() // TOLEAUTO():New("Microsoft.XMLDOM") // /* win_ole */ CreateObject( "Microsoft.XMLDOM" )
oTRDoc := _MicrosoftXMLDOM() // TOLEAUTO():New("Microsoft.XMLDOM") // /* win_ole */ CreateObject( "Microsoft.XMLDOM" )
oTDDoc := _MicrosoftXMLDOM() // TOLEAUTO():New("Microsoft.XMLDOM") // /* win_ole */ CreateObject( "Microsoft.XMLDOM" )
oXMLDoc:async := .f.
oTRDoc:async := .f.
oTDDoc:async := .f.
cXMLSedex := XMLGetFull( "table", cXMLSedex, .f., [ class="tabelaListagemDados] )
//lSuccess := oXMLDoc:load( cXMLSedex ) // Usado para carregar arquivo do disco
lSuccess := oXMLDoc:loadXML( cXMLSedex ) // Usado para receber string de conteudo
endif
if !lSuccess // se NAO abriu com sucesso...
VerifyINI( "Geral", "ForcaContingencia", "S", cPathDados+"\nfw.ini", .T. )
VerifyINI( "SEFAZ", "Status", "OFF", cPathDados+"\nfw.ini", .T. )
oWnd:oMsgBar:DelItem( oMsgItemCFaz )
oMsgItemCFaz := TMsgItem():New(oWnd:oMsgBar,,24,,,,.t.,,"level2",, "Informa SEFAZ status" )
oMsgItemCFaz:Refresh()
else
// Cria objeto principal
VerifyINI( "Geral", "ForcaContingencia", "N", cPathDados+"\nfw.ini", .T. )
VerifyINI( "SEFAZ", "Status", "ON", cPathDados+"\nfw.ini", .T. )
oTRTags := oXMLDoc:getElementsByTagName( "tr" )
aTRTags := {}
cTRTags := ""
for iTRTags = 2 to oTRTags:length
// Traz a linha TR
cTRTag := oTRTags:Item(iTRTags-1):xml
oTRDoc:loadXML( cTRTag )
oTDTags := oTRDoc:getElementsByTagName( "td" )
aTDCols := { "Autorizador", "Autorizacao", "Retorno", "Inutilizacao", "ConsStatus", "Status", "TempoMedio", "ConsCadastro", "RecepEventos" }
aTDTags := {}
cTDTags := ""
for iTDTags = 1 to oTDTags:length
// Traz a coluna TD
cTDTag := XMLGet( "td", oTDTags:Item(iTDTags-1):xml )
cTDTag := strTran( cTDTag, [<img src="imagens/], "" )
cTDTag := strTran( cTDTag, [.png"/>], "" )
cTDTag := strTran( cTDTag, [<span></span>], "-" )
cTDTag := strTran( cTDTag, [bola_], "" )
cTDTag := strTran( cTDTag, [_P], "" )
if iTDTags = 1
ciTDTag := cTDTag
endif
cTDTags := cTDTags + ["] + alltrim(aTDCols[iTDTags]) + [":"] + cTDTag + ["] + iif(iTDTags=9,[],[,] + CRLF )
aadd( aTDTags, cTDTag )
next
cTRTags := cTRTags + [{] + CRLF + cTDTags + CRLF + [}] + iif(iTRTags=oTRTags:length,[],[, ] + CRLF )
aadd( aTRTags, aTDTags )
next
// ---------- Padrao de Pesquisa
cAutorizador := VerifyINI( "SEFAZ", "autorizador" , "SP", cPathRaiz+"\DEVELOP.ini", .F. )
cOperacao := VerifyINI( "SEFAZ", "operacao" , 6 , cPathRaiz+"\DEVELOP.ini", .F. )
// ---------- 1-Autorizador, 2-Autorizacao, 3-Retorno, 4-Inutilizacao, 5-ConsStatus, 6-Status, 7-TempoMedio, 8-ConsCadastro, 9-RecepEventos
nTPos := AScan( aTRTags, { | e | e[1] == cAutorizador } ) // Pega todos os status do autorizador configurado
cAutorizacao := VerifyINI( "SEFAZ", "Autorizacao" , aTRTags[nTPos,2], cPathRaiz+"\DEVELOP.ini", .F. )
cRetorno := VerifyINI( "SEFAZ", "Retorno" , aTRTags[nTPos,3], cPathRaiz+"\DEVELOP.ini", .F. )
cInutilizacao := VerifyINI( "SEFAZ", "Inutilizacao", aTRTags[nTPos,4], cPathRaiz+"\DEVELOP.ini", .F. )
cConsStatus := VerifyINI( "SEFAZ", "ConsStatus" , aTRTags[nTPos,5], cPathRaiz+"\DEVELOP.ini", .F. )
cStatus := VerifyINI( "SEFAZ", "Status" , aTRTags[nTPos,6], cPathRaiz+"\DEVELOP.ini", .F. )
cTempoMedio := VerifyINI( "SEFAZ", "TempoMedio" , aTRTags[nTPos,7], cPathRaiz+"\DEVELOP.ini", .F. )
cConsCadastro := VerifyINI( "SEFAZ", "ConsCadastro", aTRTags[nTPos,8], cPathRaiz+"\DEVELOP.ini", .F. )
cRecepEvento := VerifyINI( "SEFAZ", "RecepEvento" , aTRTags[nTPos,9], cPathRaiz+"\DEVELOP.ini", .F. )
//
oWnd:oMsgBar:DelItem( oMsgItemCFaz )
oMsgItemCFaz := TMsgItem():New(oWnd:oMsgBar,,24,,,,.t.,,"level1",, "Informa SEFAZ status" )
oMsgItemCFaz:Refresh()
endif
SysRefresh()
HB_GCALL( .T. ) // limpar o lixo na memoria .F. so se tiver lixo
RETURN nil
FUNCTION IEGetSEFAZ( _uf_, _operacao_, _lista_ )
LOCAL aList := { ;
{ "BA", "verde", "verde", "verde", "verde", "verde", "verde", "verde", "verde" } , ;
{ "RJ", "verde", "verde", "verde", "verde", "verde", "verde", "verde", "verde" } , ;
{ "SP", "verde", "verde", "verde", "verde", "verde", "verde", "verde", "verde" } , ;
{ "MG", "verde", "verde", "verde", "verde", "verde", "verde", "verde", "verde" } , ;
{ "PR", "verde", "verde", "verde", "verde", "verde", "vermelho", "verde", "verde" } }
DEFAULT _lista_ := aList
cResName := "verde"
IF ( nPos := AScan( _lista_, { | e | e[1] == _uf_ } ) ) != 0
_cBola_ := _lista_[ nPos, _operacao_ ]
aCORList := { ;
{ "verde" , "LEVEL1" } , ;
{ "vermelho", "LEVEL2" } , ;
{ "amarela" , "LEVEL3" } }
IF ( nCPos := AScan( aCORList, { | e | e[1] == _cBola_ } ) ) != 0
cResName := strtran( cPathRaiz+"\imagens\" + aCORList[ nCPos, 2 ] + ".bmp", "\\", "\" )
cResName := aCORList[ nCPos, 2 ]
ENDIF
IF !("verde" $ aCORList[ nCPos, 2 ]) // Forcando contingencia
VerifyINI( "SEFAZ", "Status", "OFF", cPathRaiz+"\nfw.ini", .T. )
ELSE
VerifyINI( "SEFAZ", "Status", "ON", cPathRaiz+"\nfw.ini", .T. )
ENDIF
ENDIF
RETURN { _cBola_, cResName, _lista_ }
/*
* Escreve e le arquivos INI usando classe interna do Fivewin
*/
FUNCTION VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ )
oIni := TIni():New( _inifile_ )
if _grava_ = .t.
oIni:Set( _section_, _entry_, _var_ )
endif
return oIni:Get( _section_, _entry_, _var_, _var_ )
/*
* Minha funcao de gravacao de arquivo sem o lixo do comando padrao
*/
FUNCTION rMemoWrit( _aquivo_, _conteudo_ )
nHandle := fCreate( _aquivo_ )
fWrite( nHandle, _conteudo_, LEN( _conteudo_ ) )
fClose( nHandle )
return .t.
