Como disparar um e-Mail ao incluir, alterar ou excluir um registro em MVC

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.

Exemplo do email de inclusão

Abaixo um print do e-Mail de alteração.

Exemplo do email de alteração

E abaixo um print do e-Mail de exclusão.

Exemplo do email 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 += "
" + CRLF cMensagem += "" + 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 += "
" + CRLF cMensagem += "" + 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 += "
" + CRLF cMensagem += "" + CRLF cMensagem += "

Abaixo as alterações efetuadas:

" + CRLF cMensagem += "" + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF //Percorre todos os campos da estrutura da tabela For nAtual := 1 To Len(aEstrut) cCampo := aEstrut[nAtual][1] cAssunto := GetSX3Cache(cCampo, "X3_TITULO") xContAnt := &("SA6->" + cCampo) xContNov := FWFldGet(cCampo) //Se a informação digitada pelo usuário for diferente da cadastrada If xContAnt != xContNov .And. xContNov != Nil cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF cMensagem += " " + CRLF EndIf Next cMensagem += " " + CRLF cMensagem += "
CampoDescriçãoConteúdo AntigoConteúdo Novo
" + cCampo + "" + cAssunto + "" + Iif(aEstrut[nAtual][2] != "C", cValToChar(xContAnt), xContAnt) + "" + 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 cMensagem

Esse 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.

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.

2 Responses

  1. Fábio Pedroza Martins disse:

    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.

Deixe uma resposta

Terminal de Informação