Utilizando a função PSWName()


Hoje me perguntaram se era possível validar a senha do usuário Protheus dentro de qualquer rotina do sistema, mesmo se o usuário não estivesse logado. Aí perguntei como assim, o que gostaria de criar? A ideia seria, montar uma rotina para autorizar a liberação de desconto dentro da rotina padrão Pedido de Vendas, mas usando o usuário e senha do Protheus. Se usuário e senha OK, desconto liberado! Para fazer isso, podemos utilizar a função PSWName() A função PSWName() verifica se a senha informada passada como parâmetro confere com a senha do último usuário posicionado pela função PswSeek. Para isso, eu deverei saber quais usuários podem dar o desconto, eu criaria uma tabela para armazenar o usuário e o percentual mínimo e máximo permitido. Depois na tabela SC6 - Itens do Pedido de Vendas, eu criaria uma validação que irá retornar falso ou verdadeiro quando eu informa o percentual do desconto (caso esteja trabalhando com percentual). Abriria uma janela para eu informar o usuário e a senha e ao confirmar validar a senha conforme o que está no cadastro de usuários do sistema. Acho que até aqui é simples fazer, então irei direto ao código:  

Static Function fAutoriza()

	Local cCodigo   := Space(6)
	Local cSenha    := Space(30)
	Local lAutoriza := .F.
	Local nOpca     := 0

	DEFINE MSDIALOG oDlgSenha TITLE "Autorização" From 001,001 to 125,300 Pixel STYLE DS_MODALFRAME

	oSaySenha := tSay():New(012,010,{|| "Usuário:"   },oDlgSenha,,,,,,.T.,CLR_BLACK,CLR_WHITE,50,9)
	oGetSenha := tGet():New(010,050,{|u| if(PCount()>0,cCodigo:=u,cCodigo)}, oDlgSenha,080,9,"@A",{ ||  },,,,,,.T.,,, { || .T. } ,,,,.F.,,,'cCodigo')

	oSaySenha := tSay():New(022,010,{|| "Digite a senha:"   },oDlgSenha,,,,,,.T.,CLR_BLACK,CLR_WHITE,50,9)
	oGetSenha := tGet():New(020,050,{|u| if(PCount()>0,cSenha:=u,cSenha)}, oDlgSenha,080,9,"@A",{ ||  },,,,,,.T.,,, { || .T. } ,,,,.F.,.T.,,'cSenha')

	oBtnOk := tButton():New(040,035,"Ok"  , oDlgSenha, {|| nOpca := 1, ::End() },40,12,,,,.T.,,,, { ||  },,)
	oBtnNo := tButton():New(040,080,"Cancelar"  , oDlgSenha, {|| ::End() },40,12,,,,.T.,,,, { ||  },,)

	ACTIVATE MSDIALOG oDlgSenha CENTERED
	
	If nOpca == 1
		dbSelectArea("Z99")
		Z99->(dbSetOrder(1))
		Z99->(dbGoTop())
		If SRA->(dbSeek(xFilial("Z99")+cCodigo))
			
			PswOrder(1)
			If PswSeek(SRA->RA_ZUSER)
				lAutoriza := PswName(cSenha)
			EndIf
		EndIf
	Endif

	If !lAutoriza .And. nOpca == 1
		MsgStop("Usuário e/ou senha inválidos!","SEM PERMISSÃO")
	EndIf

Return lAutoriza
Se tudo ok, retorno para a validação do campo verdadeiro e com isso permitindo o desconto. Caso contrário alerta que usuário/senha estão inválidos. Espero que tenha sido útil.