Created
June 8, 2022 17:38
-
-
Save lucasvalhos/9ba4a89bfe8c780ba31b85e99aef93ce to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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