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 := '

Olá.

' + CRLF cCorpoMsg += '

Um novo funcionário foi admitido, verifique se será necessário liberar acessos aos sistemas.

' + CRLF cCorpoMsg += '

Abaixo os dados:

' + CRLF cCorpoMsg += '
    ' + CRLF cCorpoMsg += '
  • Filial: ' + SRA->RA_FILIAL + '
  • ' + CRLF cCorpoMsg += '
  • Matrícula: ' + SRA->RA_MAT + '
  • ' + CRLF cCorpoMsg += '
  • Nome: ' + Alltrim(Capital(SRA->RA_NOMECMP)) + '
  • ' + CRLF cCorpoMsg += '
' + CRLF cCorpoMsg += '

e-Mail gerado automaticamente em ' + dToC(Date()) + ' às ' + Time() + '.

' + 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'
#Include 'FWMVCDef.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 := '

Olá.

' + CRLF cCorpoMsg += '

Um funcionário foi demitido, verifique se será necessário bloquear acessos aos sistemas.

' + CRLF cCorpoMsg += '

Abaixo os dados:

' + CRLF cCorpoMsg += '
    ' + CRLF cCorpoMsg += '
  • Filial: ' + SRA->RA_FILIAL + '
  • ' + CRLF cCorpoMsg += '
  • Matrícula: ' + SRA->RA_MAT + '
  • ' + CRLF cCorpoMsg += '
  • Nome: ' + Alltrim(Capital(SRA->RA_NOMECMP)) + '
  • ' + CRLF cCorpoMsg += '
' + CRLF cCorpoMsg += '

e-Mail gerado automaticamente em ' + dToC(Date()) + ' às ' + Time() + '.

' + 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 (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.

6 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

  2. O PE referente a contratação funcionou, mas o de demissão não consegui rodar, pode me auiliar?

    • Bom dia Cristiane, tudo bem?

      Então, se:
      a. Você pegar o conteúdo do exemplo, e criar o GPEM040_pe.prw (não pode ser o mesmo nome do padrão, que é GPEM040.prw)
      b. Compilar essa função que estará dentro do seu GPEM040_pe.prw
      c. Colocar um breakpoint na linha que é declarado o aArea
      d. Debugar o fonte

      Mesmo seguindo os passos acima, ele não para no breakpoint?

  3. candykidzz disse:

    Olá Atílio, muito legal a ideia parabéns.
    Então estou com o seguinte problema, ao executar o PE_GPEM040.prw, no meu caso:

    THREAD ERROR ([31096], xxxxxxx.xxxxxxx, PO69_RH-DT) 23/05/2023 12:08:09
    variable does not exist MODEL_OPERATION_INSERT on U_GPEM040(PE_GPEM040.PRW) 12/04/2023 17:02:55 line : 47

    [TOTVS build: 7.00.210324P-20230411]
    Called from EXECBLOCK(APLIB190.PRW) 04/10/2022 11:41:04 line : 165
    Called from FWVLDACTIVATE(PROTHEUSFUNCTIONMVC.PRX) 04/10/2022 11:41:06 line : 5429
    Called from {|OBJ| FWVLDACTIVATE(SELF,OBJ) }(MPFORMMODEL.PRX) 04/10/2022 11:41:06 line : 473

    • Bom dia, tudo joia?
      Obrigado pelo feedback.
      Então eu havia esquecido de colocar a include “FWMVCDef.ch” no código do exemplo. Já atualizei ele.
      Basta você adicionar essa include também no seu código.
      Um grande abraço.

Deixe uma resposta

Terminal de Informação