Disparo de e-Mail na admissão e demissão de funcionários | Ti Responde 015

No vídeo de hoje, vamos demonstrar o disparo de email na admissão e demissão de funcionários (via pontos de entrada), ideal para o pessoal de TI ter que cadastrar ou bloquear os acessos de algum usuário.

Hoje, a dúvida foi feita por alguns alunos, onde perguntaram se era possível disparar um email para o setor de TI ao cadastrar ou excluir um funcionário.

Então foram criados dois pontos de entrada, um na admissão e outro na rescisão para demonstrar como disparar o email avisando assim o setor de TI.

E abaixo os códigos fonte desenvolvido para exemplificar. Ponto de Entrada GP010AGRV (Admissão):

//Bibliotecas
#Include 'TOTVS.ch'

/*/{Protheus.doc} User Function GP010AGRV
Ponto de entrada após gravar na rotina de cadastro de funcionários
@type  Function
@author Atilio
@since 03/03/2022
@see https://centraldeatendimento.totvs.com/hc/pt-br/articles/360020432511-MP-ADVPL-GP010AGRV
/*/

User Function GP010AGRV()
	Local aArea     := FWGetArea()
	Local nOpc      := ParamIXB[1]
	Local lGrava    := ParamIXB[2]
	Local cCorpoMsg := ""
	Local cAssunto  := "Admissão de Funcionário (" + Alltrim(Capital(SRA->RA_NOME)) + ")"
	Local cPara     := SuperGetMV("MV_X_DESTI", .F., "email@empresa.com;")

	//Se o registro foi gravado (e for inclusão ou cópia)
	If lGrava .And. (nOpc == 3 .Or. nOpc == 7)
		//Monta a mensagem do email e realiza o disparo
		cCorpoMsg := '<p>Olá.</p>' + CRLF
		cCorpoMsg += '<p>Um novo funcionário foi admitido, verifique se será necessário liberar acessos aos sistemas.</p>' + CRLF
		cCorpoMsg += '<p>Abaixo os dados:</p>' + CRLF
		cCorpoMsg += '<ul>' + CRLF
		cCorpoMsg += '<li><strong>Filial:</strong> ' + SRA->RA_FILIAL + '</li>' + CRLF
		cCorpoMsg += '<li><strong>Matrícula:</strong> ' + SRA->RA_MAT + '</li>' + CRLF
		cCorpoMsg += '<li><strong>Nome:</strong> ' + Alltrim(Capital(SRA->RA_NOMECMP)) + '</li>' + CRLF
		cCorpoMsg += '</ul>' + CRLF
		cCorpoMsg += '<p>e-Mail gerado automaticamente em ' + dToC(Date()) + ' às ' + Time() + '.</p>' + CRLF
		
		GPEMail(cAssunto, cCorpoMsg, cPara)
	EndIf

	FWRestArea(aArea)
Return

Ponto de Entrada GPEM040 no id MODELCOMMITNTTS (Demissão):

//Bibliotecas
#Include 'TOTVS.ch'
#Include 'TopConn.ch'

/*/{Protheus.doc} User Function GPEM040
Ponto de entrada ao dmeitir o funcionário
@type  Function
@author Atilio
@since 03/03/2022
/*/

User Function GPEM040()
	Local aArea			:= FWGetArea()
	Local aParam     	:= PARAMIXB
	Local cIdPonto		:= ""
	Local cAssunto		:= "Rescisão de Funcionário (" + Alltrim(Capital(SRA->RA_NOME)) + ")"
	Local cPara			:= SuperGetMV("MV_X_DESTI", .F., "email@empresa.com;")
	Local xRet			:= .T.
	Local nOperation
	Local oObjForm
	Local nSRGDemit     := 0

	//Se veio parâmetors na rotina
	If ! Empty(aParam)
		oObjForm    := aParam[1]
		cIdPonto    := aParam[2]
		nOperation	:= oObjForm:GetOperation()

		//Tratativa após o commit da operação somente na inclusão
		If nOperation == MODEL_OPERATION_INSERT .and. cIdPonto == "MODELCOMMITNTTS"

			//Busca quantos registros tem na SRG (Rescisões)
			nSRGDemit := fSRGDemit(SRA->RA_FILIAL, SRA->RA_MAT)

			//Somente se tiver uma única linha na SRG (não tem complemento)
			If nSRGDemit == 1
                //Monta a mensagem do email e realiza o disparo
                cCorpoMsg := '<p>Olá.</p>' + CRLF
                cCorpoMsg += '<p>Um funcionário foi demitido, verifique se será necessário bloquear acessos aos sistemas.</p>' + CRLF
                cCorpoMsg += '<p>Abaixo os dados:</p>' + CRLF
                cCorpoMsg += '<ul>' + CRLF
                cCorpoMsg += '<li><strong>Filial:</strong> ' + SRA->RA_FILIAL + '</li>' + CRLF
                cCorpoMsg += '<li><strong>Matrícula:</strong> ' + SRA->RA_MAT + '</li>' + CRLF
                cCorpoMsg += '<li><strong>Nome:</strong> ' + Alltrim(Capital(SRA->RA_NOMECMP)) + '</li>' + CRLF
                cCorpoMsg += '</ul>' + CRLF
                cCorpoMsg += '<p>e-Mail gerado automaticamente em ' + dToC(Date()) + ' às ' + Time() + '.</p>' + CRLF
                
                GPEMail(cAssunto, cCorpoMsg, cPara)
			EndIf
		EndIf
	EndIf

	FWRestArea(aArea)
Return xRet

Static Function fSRGDemit(cFilFun, cMatFun)
	Local aArea   := FWGetArea()
	Local cQrySRG := ""
	Local nQtdSRG := 0

    //Efetua a busca dos dados na SRG
	cQrySRG := " SELECT  " + CRLF
	cQrySRG += " 	COUNT(*) AS TOTAL " + CRLF
	cQrySRG += " FROM  " + CRLF
	cQrySRG += " 	" + RetSQLName("SRG") + " SRG " + CRLF
	cQrySRG += " WHERE " + CRLF
	cQrySRG += " 	RG_FILIAL = '" + cFilFun + "' " + CRLF
	cQrySRG += " 	AND RG_MAT = '" + cMatFun + "' " + CRLF
	cQrySRG += " 	AND SRG.D_E_L_E_T_ = ' ' " + CRLF
	TCQuery cQrySRG New Alias "QRY_SRG"

	//Se tem dados, atualiza o retorno
	If ! QRY_SRG->(EoF())
		nQtdSRG := QRY_SRG->TOTAL
	EndIf
	QRY_SRG->(DbCloseArea())

	FWRestArea(aArea)
Return nQtdSRG

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

2 Responses

  1. Tiago Fonseca Lima disse:

    Bom dia, essa função foi muito útil, acabei de fazer aqui pra minha empresa. Dan é top demais, grande abraço

Deixe uma resposta para Tiago Fonseca Lima Cancelar resposta