Skip to content

Instantly share code, notes, and snippets.

@lucasvalhos
Created June 8, 2022 17:38
Show Gist options
  • Save lucasvalhos/9ba4a89bfe8c780ba31b85e99aef93ce to your computer and use it in GitHub Desktop.
Save lucasvalhos/9ba4a89bfe8c780ba31b85e99aef93ce to your computer and use it in GitHub Desktop.
public class AcaoMarketingController {
/**
* RF-001
* Não é permitido criar uma nova ação de marketing
* com o status diferente de 'Não iniciado'.
*/
public static void validaCriacaoStatus(List<AcaoMarketing__c> acoes){
for(AcaoMarketing__c acao : acoes){
if(acao.StatusAcao__c != 'Não iniciada'){
acao.addError('Não é permitido criar uma nova ação de marketing com o status diferente de Não iniciado');
}
}
}
/**
* RF-002
*
* Se o tipo de ação (TipoAcao__c) for igual a Envio de Brinde
* ou Convite para Evento, preencha o campo Detalhe do Tipo (DetalheTipo__c).
*/
public static void validaTipoAcao(List<AcaoMarketing__c> acoes){
for(AcaoMarketing__c acao : acoes){
if(acao.TipoAcao__c != null && (acao.TipoAcao__c.contains('Envio de Brinde') || acao.TipoAcao__c.contains('Convite para Evento')) && (acao.DetalheTipo__c == null || acao.DetalheTipo__c.trim() == '')){
acao.addError('Se o tipo de ação for igual a Envio de Brinde ou Convite para Evento, preencha o campo Detalhe do Tipo.');
}
}
}
/**
* RF-003
*
* Não pode criar ação de envio de email para contatos que não autorizaram o envio.
*/
public static void checarSeContatoAutorizouEnvioDeEmail(List<AcaoMarketing__c> acoes){
Set<Id> idsContatos = new Set<Id>();
for(AcaoMarketing__c acao : acoes){
if(acao.TipoAcao__c != null && acao.TipoAcao__c.contains('Envio de Email') && acao.Contato__c != null){
idsContatos.add(acao.Contato__c);
}
}
List<Contact> contatos = [SELECT Id, AutorizouEnvioEmail__c FROM Contact WHERE Id IN :idsContatos];
Map<Id,Boolean> mapaContatos = new Map<Id,Boolean>();
for(Contact contato : contatos){
mapaContatos.put(contato.Id, contato.AutorizouEnvioEmail__c);
}
for(AcaoMarketing__c acao : acoes){
if(acao.TipoAcao__c != null && acao.TipoAcao__c.contains('Envio de Email') && acao.Contato__c != null){
if(!mapaContatos.get(acao.Contato__c)){
acao.addError('O contato não autorizou envio de email');
}
}
}
}
/**
* RF004
*
* Ao alterar uma ação de marketing, não permitir que o usuário
* escolha a opção "Não iniciada", se o campo Status da ação
* encontra-se no status "Em andamento".
*/
public static void checarStatusNaoIniciado(List<AcaoMarketing__c> novasAcoes, Map<Id,AcaoMarketing__c> mapAcoesAntigas){
for(AcaoMarketing__c novaAcao : novasAcoes){
// Não iniciada - Não iniciada - PASSA
// Não iniciada - EM andamento - Bloquear
// Não iniciada - Concluída - Bloquear
if(novaAcao.StatusAcao__c == 'Não iniciada' && mapAcoesAntigas.get(novaAcao.Id).StatusAcao__c != 'Não iniciada'){
novaAcao.addError('Não é possível colocar o status como Não iniciada');
}
}
}
/**
* RF005
*
* Não é permitido alterar ação de marketing quando o status da ação for Concluída
*/
public static void bloquearAlteracaoStatusConcluido(List<AcaoMarketing__c> acoes, Map<Id,AcaoMarketing__c> mapAcoesAntigas){
for(AcaoMarketing__c novaAcao : acoes){
if(novaAcao.StatusAcao__c == 'Concluída' && mapAcoesAntigas.get(novaAcao.Id).StatusAcao__c == 'Concluída'){
novaAcao.addError('Ações concluídas não podem ser alteradas');
}
}
}
/**
* RF006
*
* Ao colocar uma Ação de Marketing em andamento, criar uma tarefa para o
* usuário que criou a ação de marketing.
*
*/
public static void criarTarefa(List<AcaoMarketing__c> acoes, Map<Id,AcaoMarketing__c> mapAcoesAntigas){
System.debug('Entrou no criarTarefa');
List<Task> tarefas = new List<Task>();
for(AcaoMarketing__c acao : acoes){
System.debug('Status da ação: '+ acao.StatusAcao__c);
if(acao.StatusAcao__c == 'Em andamento' && mapAcoesAntigas.get(acao.Id).StatusAcao__c != 'Em andamento' && acao.Contato__c != null){
Task tarefa = new Task();
tarefa.Subject = 'Other';
tarefa.WhoId = acao.Contato__c;
tarefa.WhatId = acao.Id;
Date hoje = System.today();
tarefa.ActivityDate = hoje.addDays(10);
tarefa.Priority = 'Normal';
tarefas.add(tarefa);
}
}
insert tarefas;
}
/**
* RF007
*
* Ao mudar uma tarefa para o Status concluído, verificar se existe alguma tarefa pendente
* para a ação de marketing, se houver, não permitir a conclusão da tarefa.
*
*/
public static void checarTarefasPendentes(List<AcaoMarketing__c> acoes){
Set<Id> idsAcoes = new Set<Id>();
for(AcaoMarketing__c acao : acoes){
idsAcoes.add(acao.Id);
}
List<Task> tarefas = [SELECT Id, WhatId FROM Task WHERE WhatId IN :idsAcoes AND Status != 'Completed'];
Set<Id> idsAcoesComTarefas = new Set<Id>();
for(Task tarefa : tarefas){
idsAcoesComTarefas.add(tarefa.WhatId);
}
for(AcaoMarketing__c acao : acoes){
if(acao.StatusAcao__c == 'Concluída' && idsAcoesComTarefas.contains(acao.Id)){
acao.addError('Não é possível concluir uma ação de marketing com tarefas pendentes');
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment