Como bloquear o botão Refresh da tela de Monitoramento de NFe

No artigo de hoje, vamos demonstrar em como bloquear o botão Refresh na tela de Monitoramento de Notas.

Imagina o seguinte cenário, onde os usuários do Faturamento ao clicarem na opção de Monitorar Notas, na segunda tela que é exibida, eles ficarem clicando sem parar no botão Refresh.

 

Isso pode acabar acarretando na mensagem “Rejeição 656 – Consumo Indevido”.

 

Para tentar sanar essa questão, desenvolvemos um paliativo, que na verdade impede que o usuário fique clicando nesse botão, sendo que a partir da segunda vez que ele clica, é exibido uma mensagem de aguardar 10 segundos.

 

O primeiro passo então, foi encontrar o ponto de entrada necessário para fazer esse ajuste, sendo que o utilizado foi o FISMNTNFE.

 

O segundo passo, foi ao construir o ponto de entrada, colocar um breakpoint logo no começo para ver a pilha de chamadas quando é disparado pelo botão, sendo que foi identificado que vem de um bloco de código, conforme print abaixo:

Verificando a pilha de chamadas

Verificando a pilha de chamadas

 

Então foi montado a seguinte lógica:

  1. Criação de uma variável que guarda a última vez que foi clicada no botão
  2. É feito um laço de repetição na pilha de chamadas (buscando o ProcName de cada posição)
  3. Se encontrar o bloco de códigos conforme o print acima, marca a variável lVeioBotao como true
  4. Ao sair do laço de repetição, se veio do botão e não tiver tempo ainda, atualiza a variável
  5. Do contrário, aciona a função zDlgEspera aguardando 10 segundos com uma mensagem personalizada (print abaixo)
Mensagem para aguardar 10 segundos

Mensagem para aguardar 10 segundos

 

E abaixo o código fonte conforme a lógica acima:

//Bibliotecas
#Include "TOTVS.ch"

//Último tempo executado
Static cUltTempo := ""

/*/{Protheus.doc} User Function FISMNTNFE 
Ponto de Entrada acionado na tela de Monitoramento de NFe
@type  Function
@author Atilio
@since 11/07/2024
@see https://tdn.totvs.com/display/public/TSS/FISMNTNFE+-+Monitor+Faixa+da+NF-e
/*/

User Function FISMNTNFE()
    Local aArea      := FWGetArea()
    Local cMensagem  := "Já foi clicado no <strong>Refresh</strong> nos últimos 10 segundos!<br>Aguarde mais <font color='red'>10 segundos</font> para tentar novamente!"
	Local cTitulo    := "Aguarde"
	Local nSegundos  := 10
	Local cHoraAtual := Time()
	Local lVeioBotao := .F.
	Local nAtual     := 0

	//Enquanto for verdadeiro
    While .T.

        //Busca o nome do processo atual
        cProcAtu  := Alltrim(Upper(ProcName(nAtual)))

        //Se tem processo
        If ! Empty(cProcAtu) 
			
			//Se veio do listbox pra atualizar a tela
			If "ALISTBOX:=GETLISTBOX(" $ cProcAtu
            	lVeioBotao := .T.
			EndIf

        //Senão, encerra o laço
        Else
            Exit
        EndIf

        //Incrementa o contador dos processos
        nAtual++
    EndDo

	//Somente se veio do botão de Refresh
	If lVeioBotao

		//Se o tempo tiver vazio ou for maior que 10 segundos
		If Empty(cUltTempo) .Or. ElapTime(cUltTempo, cHoraAtual) > "00:00:10"
			cUltTempo := Time()
		
		//Senão, mostra mensagem para esperar
		ElseIf ! cHoraAtual == cUltTempo
			u_zDlgEspera(cMensagem, cTitulo, nSegundos)
		EndIf
	EndIf

    FWRestArea(aArea)
Return

/*/{Protheus.doc} User Function zDlgEspera
Função que abre uma dialog sem opção de fechar e sem o -ESC- por um curto período de tempo
@type  Function
@author Atilio
@since 11/07/2024
@param cMensagem, Caractere, Mensagem que aparecerá na tela
@param cTitulo, Caractere, Título da tela da mensagem
@param nSegundos, Numérico, Número de segundos
/*/

User Function zDlgEspera(cMensagem, cTitulo, nSegundos)
	Local aArea         := FWGetArea()
	Local bTimer		:= {|| oDialog:DeActivate()}
	Local oDialog
	Local oPanel
	Local oSayMsg
	Default cMensagem   := "Aguarde 3 segundos"
	Default cTitulo     := "Atenção"
	Default nSegundos   := 3

	//Configura a Dialog
	oDialog := FWDialogModal():New()
	oDialog:SetBackground(.F.)
	oDialog:SetTitle(cTitulo)
	oDialog:SetEscClose(.F.)
	oDialog:SetSize(80, 150) 
	oDialog:SetCloseButton(.F.)
	oDialog:CreateDialog() 
	oDialog:SetTimer(nSegundos, bTimer)

	//Pega o painel e insere uma mensagem nele
	oPanel := TPanel():New(/*nRow*/, /*nCol*/, /*cText*/, oDialog:GetPanelMain())
	oPanel:Align := CONTROL_ALIGN_ALLCLIENT
	oSayMsg := TSay():New(1, 1, {|| cMensagem}, oPanel, /*cPicture*/, /*oFont*/, /*uParam7*/, /*uParam8*/, /*uParam9*/, .T., /*nClrText*/, /*nClrBack*/, (oPanel:nWidth)/2 - 1, (oPanel:nHeight)/2 - 1, /*uParam15*/, /*uParam16*/, /*uParam17*/, /*uParam18*/, /*uParam19*/, .T.)

	//Abre a Dialog
	oDialog:Activate()	

	FWRestArea(aArea)
Return

Referências:

 

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação