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.
Bom dia, essa função foi muito útil, acabei de fazer aqui pra minha empresa. Dan é top demais, grande abraço
Opa, obrigado pelo feedback Tiago.
Um grande abraço.
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?
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.