No artigo de hoje, vou mostrar como fazer um ponto de entrada em MVC, e que dispare um e-Mail ao incluir / alterar / excluir o registro.
Basicamente a lógica jovens, é interceptar a operação antes de fazer o commit, e montar 3 mensagens diferentes dependendo da operação realizada.
E na alteração, o que fazemos é pegar a estrutura da tabela com DbStruct, então fazemos um laço de repetição comparando o valor antigo com o novo, caso seja diferente será adicionado em uma tabela em HTML.
Abaixo um print do e-Mail de inclusão.
Abaixo um print do e-Mail de alteração.
E abaixo um print do e-Mail de exclusão.
Por último, abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "TOTVS.ch"
/*/{Protheus.doc} User Function MATA070
P.E. no Cadastro de Bancos
@author Atilio
@since 02/07/2021
@version 1.0
@type function
@obs Salve o arquivo como MATA070_pe.prw
/*/
User Function MATA070()
Local aArea := GetArea()
Local aParam := PARAMIXB
Local xRet := .T.
Local oObj := Nil
Local cIdPonto := ''
Local cIdModel := ''
Local nOper := 0
Local cPara := Alltrim(SuperGetMV("MV_X_EMBCO", .F., ""))
Local cMensagem := ''
Local cAssunto := ''
//Se tiver parâmetros
If aParam != Nil
//Pega informações dos parâmetros
oObj := aParam[1]
cIdPonto := aParam[2]
cIdModel := aParam[3]
//Validação ao clicar no Botão Confirmar
If cIdPonto == 'MODELPOS'
nOper := oObj:nOperation
cMensagem := ''
xRet := .T.
//Se for uma inclusão
If nOper == 3
cAssunto := "[Protheus] Inclusão no Cadastro de Bancos"
cMensagem := fMensInc()
//Se for uma alteração
ElseIf nOper == 4
cAssunto := "[Protheus] Alteração no Cadastro de Bancos"
cMensagem := fMensAlt()
//Se for uma exclusão
ElseIf nOper == 5
cAssunto := "[Protheus] Exclusão no Cadastro de Bancos"
cMensagem := fMensExc()
EndIf
u_zEnvMail(cPara, cAssunto, cMensagem)
EndIf
EndIf
RestArea(aArea)
Return xRet
Static Function fMensInc()
Local aArea := GetArea()
Local cMensagem := ""
cMensagem += "Olá.
" + CRLF
cMensagem += "" + CRLF
cMensagem += "Um novo Banco foi cadastrado no Protheus, abaixo as principais informações cadastradas:
" + CRLF
cMensagem += "" + CRLF
cMensagem += "- " + CRLF
cMensagem += "
- Código:" + FWFldGet("A6_COD") + " " + CRLF cMensagem += "
- Agência:" + FWFldGet("A6_AGENCIA") + "-" + FWFldGet("A6_DVAGE") + " " + CRLF cMensagem += "
- Conta:" + FWFldGet("A6_NUMCON") + "-" + FWFldGet("A6_DVCTA") + " " + CRLF cMensagem += "
- Nome do Banco:" + FWFldGet("A6_NOME") + " " + CRLF cMensagem += "
e-Mail gerado automaticamente pelo Protheus no dia '" + dToC(Date()) + "' às '" + Time() + "'.
" + CRLF RestArea(aArea) Return cMensagem Static Function fMensExc() Local aArea := GetArea() Local cMensagem := "" cMensagem += "Olá.
" + CRLF cMensagem += "" + CRLF cMensagem += "O Banco citado abaixo foi excluído da base de dados do sistema:
" + CRLF cMensagem += "" + CRLF cMensagem += "- " + CRLF
cMensagem += "
- Código:" + FWFldGet("A6_COD") + " " + CRLF cMensagem += "
- Agência:" + FWFldGet("A6_AGENCIA") + "-" + FWFldGet("A6_DVAGE") + " " + CRLF cMensagem += "
- Conta:" + FWFldGet("A6_NUMCON") + "-" + FWFldGet("A6_DVCTA") + " " + CRLF cMensagem += "
- Nome do Banco:" + FWFldGet("A6_NOME") + " " + CRLF cMensagem += "
e-Mail gerado automaticamente pelo Protheus no dia '" + dToC(Date()) + "' às '" + Time() + "'.
" + CRLF RestArea(aArea) Return cMensagem Static Function fMensAlt() Local aArea := GetArea() Local cMensagem := "" Local aEstrut := SA6->(DbStruct()) Local nAtual := 0 Local cCampo Local xContAnt Local xContNov cMensagem += "Olá.
" + CRLF cMensagem += "" + CRLF cMensagem += "O Banco citado abaixo teve alterações no sistema:
" + CRLF cMensagem += "" + CRLF cMensagem += "- " + CRLF
cMensagem += "
- Código:" + FWFldGet("A6_COD") + " " + CRLF cMensagem += "
- Agência:" + FWFldGet("A6_AGENCIA") + "-" + FWFldGet("A6_DVAGE") + " " + CRLF cMensagem += "
- Conta:" + FWFldGet("A6_NUMCON") + "-" + FWFldGet("A6_DVCTA") + " " + CRLF cMensagem += "
- Nome do Banco:" + FWFldGet("A6_NOME") + " " + CRLF cMensagem += "
Abaixo as alterações efetuadas:
" + CRLF cMensagem += "| Campo | " + CRLF cMensagem += "Descrição | " + CRLF cMensagem += "Conteúdo Antigo | " + CRLF cMensagem += "Conteúdo Novo | " + CRLF cMensagem += "
|---|---|---|---|
| " + cCampo + " | " + CRLF cMensagem += "" + cAssunto + " | " + CRLF cMensagem += "" + Iif(aEstrut[nAtual][2] != "C", cValToChar(xContAnt), xContAnt) + " | " + CRLF cMensagem += "" + Iif(aEstrut[nAtual][2] != "C", cValToChar(xContNov), xContNov) + " | " + CRLF cMensagem += "
e-Mail gerado automaticamente pelo Protheus no dia '" + dToC(Date()) + "' às '" + Time() + "'.
" + CRLF RestArea(aArea) Return cMensagemEsse artigo foi uma sugestão de tema enviada pelo grande Hitler Almeida.
Obs.: A função zEnvMail para disparo de e-Mail pelo Protheus, está disponível nesse artigo – clique aqui.
Obs. 2: O ideal é pegar o valor dos campos usando GetValue no Model, porém para título de exemplo, eu usei a função FWFldGet no trecho de fonte acima
Bom pessoal, por hoje é só.
Abraços e até a próxima.



Daniel, bom dia.
Você é um verdade mestre e professor que nos ajuda muito.
Mas nesse artigo vou dar uma sugestão ao invés de fazer 3 Static Function controla pelo nOper e faz uma única Static Function (sei também que os leitores pode fazer isso ou mesmo modificar outras).
Muito obrigado por mais um artigo.
Grande Fábio, primeiramente obrigado pelo elogio, é muita generosidade sua.
Sim, eu havia pensado em fazer 1 só, mas decide segregar em 3 para ficar mais fácil de exemplificar.
Um grande abraço e eu quem agradeço pelo comentário.