Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- trigger DefaultEntitlement on Case (Before Insert, Before Update) {
- //DEFINIÇÕES:
- //EntitlementContact: Represents a Contact eligible to receive customer support via an Entitlement. This object is available in API version 18.0 and later.
- //Entitlement: Represents the customer support an account or contact is eligible to receive. This object is available in API version 18.0 and later. Entitlements may be based on an asset, product, or service contract.
- //While products represent the items that your company sells, assets represent the specific products your customers have purchased. Use assets to store information about your customers' products.
- Set<Id> contactIds = new Set<Id>();
- //Cria conjunto chamado contactIds -- armazenará Ids de contatos
- Set<Id> acctIds = new Set<Id>();
- //Cria conjunto chamado acctIds -- armazenará Ids de contas
- for (Case c : Trigger.new) {
- //Será iterado cada Case que seja novo ou atualizado e abaixo, inseridos nos conjuntos vazios criados acima os Id´s de Contato e de Conta, cada um em seu conjunto independente.
- contactIds.add(c.ContactId);
- acctIds.add(c.AccountId);
- }
- List <EntitlementContact> entlContacts =
- [Select e.EntitlementId,e.ContactId,e.Entitlement.AssetId
- From EntitlementContact e
- Where e.ContactId in :contactIds
- And e.Entitlement.EndDate >= Today
- And e.Entitlement.StartDate <= Today];
- // Cria uma lista chamada de entlContacts à partir de um SELECT de objetos de EntitlementContact, que armazena num objeto EntitlementContact o Id de um Entitlement, o Id de um contato, o Id de um Asset (purchased products), sendo todos esses, campos de EntitlementContact. Isso ocorre quando são satisfeitas as seguintes condições, simultaneamente:
- // 1º) Quando o id de um contato está contido no conjunto criado anteriormente, quando da criação de um novo caso, pela chamada de Trigger.new, ou seja, se será um contato novo relacionado ao Case.
- //E
- // 2º) Quando a data final do Entitlement (The last day the entitlement is in effect) é maior ou igual que a data do momento da criação do Case.
- //E
- // 3º) Quando a data de início do Entitlement (The first day the entitlement is in effect) é de antes da criação do caso.
- if(entlContacts.isEmpty()==false){
- // se a lista do tipo EntitlementContact não está vazia, então será
- // executado o código abaixo:
- for(Case c : Trigger.new){
- //para cada objeto Case que esteja sendo criado ou feito update,
- //será feito o teste do if abaixo. E só será executado o código
- //desse if, se não houver um Id de Entitlement dentro
- //desse novo objeto Case (criado ou sendo atualizado) e simultaneamente, se houver um Id de contato desse novo caso ou
- //update
- if(c.EntitlementId == null && c.ContactId != null){
- for(EntitlementContact ec:entlContacts){
- //será então, se forem atendidas as condições do if anterior
- //percorrida a lista de EntitlementContact para que seja verificado
- //com o if abaixo, se o ContactId de cada objeto da lista
- //EntitlementContact é igual ao ContactId de cada caso novo/update.
- if(ec.ContactId==c.ContactId){
- c.EntitlementId = ec.EntitlementId;
- //na linha acima, o EntitlementId do novo/update Case
- //é preenchido com o EntitlementId que já existia, aquele
- //que veio da lista correspondente ao SELECT
- if(c.AssetId==null && ec.Entitlement.AssetId!=null)
- c.AssetId=ec.Entitlement.AssetId;
- //nas linhas acima, se caso o AssetId do novo/update Case não esteja preenchido e o AssetId do Entitlement da lista proveniente do SELECT de EntitlementContact seja diferente de nulo será então atribuído ao AssetId do novo/update de Case, o AssetId do Entitlement da lista EntitlementContact proveniente do SELECT
- break;
- }//aqui termina o if que testa se o ContactId da lista EntitlementContact é igual ao ContactId do Caso novo/update
- }//Aqui termina o loop que itera a lista de EntitlementContact
- }//Aqui termina a verificação se EntitlementId é igual a nulo no novo/update Case E o ContactId é diferente de nulo no novo/update Case
- }//Aqui termina o loop que itera os novos/update Case
- } else{//Esse else será executado somente se o SELECT de EntitlementContact retornar vazio
- List <Entitlement> entls = [Select e.StartDate, e.Id, e.EndDate,
- e.AccountId, e.AssetId
- From Entitlement e
- Where e.AccountId in :acctIds And e.EndDate >= Today
- And e.StartDate <= Today];
- //É criada uma lista de Entitlements existentes, buscando data de início, Id, Data de Término, Conta relacionada e Produto relacionado,
- // Quando simultaneamente:
- // 1º) AccountId estiver contido no conjunto de Ids de contas, advindo
- // no novo/atualizado Case.
- // E
- // 2º) Data de término do Entitlement for maior ou igual ao dia da criação do Case
- // E
- // 3º) Data de início do Entitlement for menor ou igual ao dia da criação do Case
- if(entls.isEmpty()==false){
- //Esse if executa o código abaixo se a lista de Entitlements proveniente do SELECT acima não estiver vazia
- for(Case c : Trigger.new){
- //Loop que itera cada Case novo/update
- if(c.EntitlementId == null && c.AccountId != null){
- //Se para cada caso novo, o EntitlementId for nulo e o AccountId for diferente de nulo será iterada a lista de Entitlements no loop abaixo
- for(Entitlement e:entls){
- if(e.AccountId==c.AccountId){
- //Se cada AccountId de Entitlement for igual ao AccountId do Case forem iguais, então será atribuído ao EntitlementId do Case novo/update o Id do Entitlement da lista proveniente do SELECT de Entitlements
- c.EntitlementId = e.Id;
- if(c.AssetId==null && e.AssetId!=null)
- //Se o AssetId do novo/update Case for nulo E o AssetId Entitlement for diferente de nulo, então será atribuído o AssetId de Entitlement ao AssetId do novo Case/update
- c.AssetId=e.AssetId;
- break;
- }
- }
- }
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment