Tela de autenticação customizada no Protheus

Olá pessoal…

Hoje vou mostrar como fazer uma tela de autenticação customizada no Protheus.

Essa tela customizada, serve tanto para o desenvolvimento de rotinas que necessitem de um login, ao invés de abrir o convencional sigamdi, como também, serve para chamar alguma validação dentro de alguma rotina, por exemplo, somente se o usuário forçar o login e a senha, pode prosseguir para a alteração do produto.

A rotina valida se o usuário existe, caso não exista é mostrado uma mensagem.

Usuário não encontrado

Usuário não encontrado

Caso o usuário exista, mas a senha esteja inválida, é mostrado outra mensagem.

Senha inválida

Senha inválida

Abaixo o código fonte utilizado:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zLogin
Função para montar a tela de login simplificada
@type function
@author Atilio
@since 17/09/2015
@version 1.0
	@param cUsrLog, Caracter, Usuário para o login (ex.: "admin")
	@param cPswLog, Caracter, Senha para o login (ex.: "123")
	@return lRet, Retorno lógico se conseguiu encontrar o usuário digitado
	@example
	//Verificando se o login deu certo
	If u_zLogin(@cUsrAux, @cPswAux)
		//....
	EndIf
/*/

User Function zLogin(cUsrLog, cPswLog)
	Local aArea := GetArea()
	Local oGrpLog
	Local oBtnConf
	Private lRetorno := .F.
	Private oDlgPvt
	//Says e Gets
	Private oSayUsr
	Private oGetUsr, cGetUsr := Space(25)
	Private oSayPsw
	Private oGetPsw, cGetPsw := Space(20)
	Private oGetErr, cGetErr := ""
	//Dimensões da janela
	Private nJanLarg := 200
	Private nJanAltu := 200
	
	//Criando a janela
	DEFINE MSDIALOG oDlgPvt TITLE "Login" FROM 000, 000  TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL
		//Grupo de Login
		@ 003, 001 	GROUP oGrpLog TO (nJanAltu/2)-1, (nJanLarg/2)-3 		PROMPT "Login: " 	OF oDlgPvt COLOR 0, 16777215 PIXEL
			//Label e Get de Usuário
			@ 013, 006   SAY   oSayUsr PROMPT "Usuário:"        SIZE 030, 007 OF oDlgPvt                    PIXEL
			@ 020, 006   MSGET oGetUsr VAR    cGetUsr           SIZE (nJanLarg/2)-12, 007 OF oDlgPvt COLORS 0, 16777215 PIXEL
		
			//Label e Get da Senha
			@ 033, 006   SAY   oSayPsw PROMPT "Senha:"          SIZE 030, 007 OF oDlgPvt                    PIXEL
			@ 040, 006   MSGET oGetPsw VAR    cGetPsw           SIZE (nJanLarg/2)-12, 007 OF oDlgPvt COLORS 0, 16777215 PIXEL PASSWORD
		
			//Get de Log, pois se for Say, não da para definir a cor
			@ 060, 006   MSGET oGetErr VAR    cGetErr        SIZE (nJanLarg/2)-12, 007 OF oDlgPvt COLORS 0, 16777215 NO BORDER PIXEL
			oGetErr:lActive := .F.
			oGetErr:setCSS("QLineEdit{color:#FF0000; background-color:#FEFEFE;}")
		
			//Botões
			@ (nJanAltu/2)-18, 006 BUTTON oBtnConf PROMPT "Confirmar"             SIZE (nJanLarg/2)-12, 015 OF oDlgPvt ACTION (fVldUsr()) PIXEL
			oBtnConf:SetCss("QPushButton:pressed { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #dadbde, stop: 1 #f6f7fa); }")
	ACTIVATE MSDIALOG oDlgPvt CENTERED
	
	//Se a rotina foi confirmada e deu certo, atualiza o usuário e a senha
	If lRetorno
		cUsrLog := Alltrim(cGetUsr)
		cPswLog := Alltrim(cGetPsw)
	EndIf
	
	RestArea(aArea)
Return lRetorno

/*---------------------------------------------------------------------*
 | Func:  fVldUsr                                                      |
 | Autor: Daniel Atilio                                                |
 | Data:  17/09/2015                                                   |
 | Desc:  Função para validar se o usuário existe                      |
 *---------------------------------------------------------------------*/

Static Function fVldUsr()
	Local cUsrAux := Alltrim(cGetUsr)
	Local cPswAux := Alltrim(cGetPsw)
	Local cCodAux := ""
	
	//Pega o código do usuário
	PswOrder(2)
	If !Empty(cUsrAux) .And. PswSeek(cUsrAux)
 		cCodAux := PswRet(1)[1][1]
 	
 		//Agora verifica se a senha bate com o usuário
 		If !PswName(cPswAux)
 			cGetErr := "Senha inválida!"
 			oGetErr:Refresh()
			Return
		
		//Senão, atualiza o retorno como verdadeiro
		Else
			lRetorno := .T.
		endif
 	
 	//Senão atualiza o erro e retorna para a rotina
 	Else
 		cGetErr := "Usuário não encontrado!"
 		oGetErr:Refresh()
 		Return
	EndIf
	
	//Se o retorno for válido, fecha a janela
	If lRetorno
		oDlgPvt:End()
	EndIf
Return

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.

Caso você queira fazer uma rotina para logar, sem abrir o SIGAMDI, você pode chamar essa zLogin dentro de uma user function normal, através do seguinte trecho:

		cUsrAux := ""
		cPswAux := ""
		
		//Montando uma seção, para empresa 01 e filial 0101, apenas para fazer o login
		RPCSetType(3) 
		RPCSetEnv("01", "0101", "", "", "")
		
		//Verificando se o login deu certo
		If u_zLogin(@cUsrAux, @cPswAux)
			//Limpando o ambiente atual e criando novamente
			RPCClearEnv()
			RPCSetType(3) 
			RPCSetEnv("01", "0101", cUsrAux, cPswAux, "SIGAEST")
			
			//Chamando rotinas abaixo
			//...
		EndIf

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas na TOTVS Oeste Paulista Bauru. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

4 respostas em “Tela de autenticação customizada no Protheus

Deixe uma resposta