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