airton-junior

Untitled

Dec 5th, 2022 (edited)
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.19 KB | None | 0 0
  1. trigger DefaultEntitlement on Case (Before Insert, Before Update) {
  2. //DEFINIÇÕES:
  3. //EntitlementContact: Represents a Contact eligible to receive customer support via an Entitlement. This object is available in API version 18.0 and later.
  4. //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.
  5. //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.
  6.  
  7. Set<Id> contactIds = new Set<Id>();
  8. //Cria conjunto chamado contactIds -- armazenará Ids de contatos
  9. Set<Id> acctIds = new Set<Id>();
  10. //Cria conjunto chamado acctIds -- armazenará Ids de contas
  11. for (Case c : Trigger.new) {
  12. //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.
  13. contactIds.add(c.ContactId);
  14. acctIds.add(c.AccountId);
  15. }
  16.  
  17. List <EntitlementContact> entlContacts =
  18. [Select e.EntitlementId,e.ContactId,e.Entitlement.AssetId
  19. From EntitlementContact e
  20. Where e.ContactId in :contactIds
  21. And e.Entitlement.EndDate >= Today
  22. And e.Entitlement.StartDate <= Today];
  23. // 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:
  24. // 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.
  25. //E
  26. // 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.
  27. //E
  28. // 3º) Quando a data de início do Entitlement (The first day the entitlement is in effect) é de antes da criação do caso.
  29.  
  30. if(entlContacts.isEmpty()==false){
  31. // se a lista do tipo EntitlementContact não está vazia, então será
  32. // executado o código abaixo:
  33. for(Case c : Trigger.new){
  34. //para cada objeto Case que esteja sendo criado ou feito update,
  35. //será feito o teste do if abaixo. E só será executado o código
  36. //desse if, se não houver um Id de Entitlement dentro
  37. //desse novo objeto Case (criado ou sendo atualizado) e simultaneamente, se houver um Id de contato desse novo caso ou
  38. //update
  39. if(c.EntitlementId == null && c.ContactId != null){
  40.  
  41. for(EntitlementContact ec:entlContacts){
  42. //será então, se forem atendidas as condições do if anterior
  43. //percorrida a lista de EntitlementContact para que seja verificado
  44. //com o if abaixo, se o ContactId de cada objeto da lista
  45. //EntitlementContact é igual ao ContactId de cada caso novo/update.
  46.  
  47. if(ec.ContactId==c.ContactId){
  48. c.EntitlementId = ec.EntitlementId;
  49. //na linha acima, o EntitlementId do novo/update Case
  50. //é preenchido com o EntitlementId que já existia, aquele
  51. //que veio da lista correspondente ao SELECT
  52. if(c.AssetId==null && ec.Entitlement.AssetId!=null)
  53. c.AssetId=ec.Entitlement.AssetId;
  54. //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
  55. break;
  56. }//aqui termina o if que testa se o ContactId da lista EntitlementContact é igual ao ContactId do Caso novo/update
  57. }//Aqui termina o loop que itera a lista de EntitlementContact
  58. }//Aqui termina a verificação se EntitlementId é igual a nulo no novo/update Case E o ContactId é diferente de nulo no novo/update Case
  59. }//Aqui termina o loop que itera os novos/update Case
  60. } else{//Esse else será executado somente se o SELECT de EntitlementContact retornar vazio
  61. List <Entitlement> entls = [Select e.StartDate, e.Id, e.EndDate,
  62. e.AccountId, e.AssetId
  63. From Entitlement e
  64. Where e.AccountId in :acctIds And e.EndDate >= Today
  65. And e.StartDate <= Today];
  66. //É criada uma lista de Entitlements existentes, buscando data de início, Id, Data de Término, Conta relacionada e Produto relacionado,
  67. // Quando simultaneamente:
  68. // 1º) AccountId estiver contido no conjunto de Ids de contas, advindo
  69. // no novo/atualizado Case.
  70. // E
  71. // 2º) Data de término do Entitlement for maior ou igual ao dia da criação do Case
  72. // E
  73. // 3º) Data de início do Entitlement for menor ou igual ao dia da criação do Case
  74. if(entls.isEmpty()==false){
  75. //Esse if executa o código abaixo se a lista de Entitlements proveniente do SELECT acima não estiver vazia
  76. for(Case c : Trigger.new){
  77. //Loop que itera cada Case novo/update
  78. if(c.EntitlementId == null && c.AccountId != null){
  79. //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
  80. for(Entitlement e:entls){
  81. if(e.AccountId==c.AccountId){
  82. //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
  83. c.EntitlementId = e.Id;
  84. if(c.AssetId==null && e.AssetId!=null)
  85. //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
  86. c.AssetId=e.AssetId;
  87. break;
  88. }
  89. }
  90. }
  91. }
  92. }
  93. }
  94. }
Add Comment
Please, Sign In to add comment