Tela de autenticação customizada no Protheus

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. 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.

6 thoughts on “Tela de autenticação customizada no Protheus

Deixe uma resposta

%d blogueiros gostam disto: