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 para Dan Atilio (Daniel Atilio)Cancelar resposta

Terminal de Informação