SEFAZ: Monitor de status do serviço.

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SEFAZ: Monitor de status do serviço.

Mensagem por rochinha »

Amiguinhos,

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
          ...
Coloquei em segundo plano com verificação em intervalos. Faz acesso online, leitura do HTML, recorte do resultado e obtenção dos objetos desejados.
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"
Onde:
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.
Bons testes.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder