diff --git a/force-app/main/default/classes/MembershipContactRoleHandler.cls b/force-app/main/default/classes/MembershipContactRoleHandler.cls new file mode 100644 index 00000000..1e06c47f --- /dev/null +++ b/force-app/main/default/classes/MembershipContactRoleHandler.cls @@ -0,0 +1,42 @@ +/* +* Created by MHumpolec on 6/3/2021. +*/ + +public with sharing class MembershipContactRoleHandler extends TriggerHandler{ + + private Map touchedRoles; + private Map oldRolesMap; + @TestVisible private ConfigurationService cs; + + public MembershipContactRoleHandler(){ + cs = new ConfigurationService(); + this.touchedRoles = (Map) Trigger.newMap; + if (Trigger.oldMap != null) { + this.oldRolesMap = (Map) Trigger.oldMap; + } else { + this.oldRolesMap = new Map(); + } + } + + public override void afterUpdate(){ + managePrimaryContactRole(); + } + + /** + * If Contact Role has been marked as primary put the contact to the primary contact on membership - will roll down + */ + + private void managePrimaryContactRole (){ + List membershipsToUpdate = new List(); + + for(Id touchedRole : this.touchedRoles.keySet()) { + Boolean newPrim = touchedRoles.get(touchedRole).Is_Primary__c; + Boolean oldPrim = oldRolesMap.containsKey(touchedRole) ? oldRolesMap.get(touchedRole).Is_Primary__c : false; + if (oldPrim == false && newPrim == true) { + Membership__c m = new Membership__c( Id = touchedRoles.get(touchedRole).Membership__c, Primary_Contact__c = touchedRoles.get(touchedRole).Contact__c); + membershipsToUpdate.add( m); + } + } + update membershipsToUpdate; + } +} \ No newline at end of file diff --git a/force-app/main/default/classes/MembershipContactRoleHandler.cls-meta.xml b/force-app/main/default/classes/MembershipContactRoleHandler.cls-meta.xml new file mode 100644 index 00000000..dd61d1f9 --- /dev/null +++ b/force-app/main/default/classes/MembershipContactRoleHandler.cls-meta.xml @@ -0,0 +1,5 @@ + + + 52.0 + Active + diff --git a/force-app/main/default/classes/MembershipContactRoleService_TEST.cls b/force-app/main/default/classes/MembershipContactRoleService_TEST.cls index f98bc569..daa45ad5 100644 --- a/force-app/main/default/classes/MembershipContactRoleService_TEST.cls +++ b/force-app/main/default/classes/MembershipContactRoleService_TEST.cls @@ -160,4 +160,83 @@ private without sharing class MembershipContactRoleService_TEST { ]; System.assertEquals(0, mcrs.size(), 'expected no Roles'); } -} + + @isTest + private static void testAddSecondPrimaryContact() { + Test.startTest(); + List cs = new List{ + new Contact( + AccountId = [SELECT Id FROM Account WHERE Name = 'First Account'].Id, + FirstName = 'Molly', + LastName = 'Member' + ), + new Contact( + AccountId = [SELECT Id FROM Account WHERE Name = 'First Account'].Id, + FirstName = 'Mikaela', + LastName = 'Member' + ) + }; + insert cs; + + Membership__c m = new Membership__c( Id = [SELECT Id FROM Membership__c WHERE Name = 'First Membership'].Id, + Primary_Contact__c = cs[0].Id); + update m; + + List mcrs = [ + SELECT Id, Is_Primary__c, Name, Start_Date__c, Role__c, Membership__c, Contact__c + FROM Membership_Contact_Role__c + WHERE Membership__c = :m.Id AND Is_Primary__c = TRUE + ]; + System.assertEquals(1, mcrs.size(), 'expected 1 Primary Role'); + + m = new Membership__c( Id = [SELECT Id FROM Membership__c WHERE Name = 'First Membership'].Id, + Primary_Contact__c = cs[1].Id); + update m; + + mcrs = [ + SELECT Id, Is_Primary__c, Name, Start_Date__c, Role__c, Membership__c, Contact__c + FROM Membership_Contact_Role__c + WHERE Membership__c = :m.Id AND Is_Primary__c = TRUE + ]; + System.assertEquals(1, mcrs.size(), 'still expected only 1 Primary Role'); + } + + @isTest + private static void testMakeSecondRolePrimary() { + List cs = new List{ + new Contact( + AccountId = [SELECT Id FROM Account WHERE Name = 'First Account'].Id, + FirstName = 'Molly', + LastName = 'Member' + ), + new Contact( + AccountId = [SELECT Id FROM Account WHERE Name = 'First Account'].Id, + FirstName = 'Mikaela', + LastName = 'Member' + ) + }; + insert cs; + + Membership__c m = new Membership__c( Id = [SELECT Id FROM Membership__c WHERE Name = 'First Membership'].Id, + Primary_Contact__c = cs[0].Id); + update m; + + Test.startTest(); + List mcrs = [ + SELECT Id, Is_Primary__c, Name, Start_Date__c, Role__c, Membership__c, Contact__c + FROM Membership_Contact_Role__c + WHERE Membership__c = :m.Id AND Is_Primary__c = TRUE + ]; + System.assertEquals(1, mcrs.size(), 'expected 1 Primary Role'); + + Membership_Contact_Role__c mcr = new Membership_Contact_Role__c(Id = [SELECT Id FROM Membership_Contact_Role__c WHERE Membership__c = :m.Id AND Contact__c = :cs[1].Id].Id, Is_Primary__c = TRUE); + update mcr; + + mcrs = [ + SELECT Id, Is_Primary__c, Name, Start_Date__c, Role__c, Membership__c, Contact__c + FROM Membership_Contact_Role__c + WHERE Membership__c = :m.Id AND Is_Primary__c = TRUE + ]; + System.assertEquals(1, mcrs.size(), 'still expected only 1 Primary Role'); + } +} \ No newline at end of file diff --git a/force-app/main/default/triggers/MembershipContactRoleTrigger.trigger b/force-app/main/default/triggers/MembershipContactRoleTrigger.trigger new file mode 100644 index 00000000..6861ae24 --- /dev/null +++ b/force-app/main/default/triggers/MembershipContactRoleTrigger.trigger @@ -0,0 +1,8 @@ +/** + * Created by MHumpolec on 6/30/2021. + */ + +trigger MembershipContactRoleTrigger on Membership_Contact_Role__c (before insert, before update, before delete, + after insert, after update, after delete, after undelete) { + new MembershipContactRoleHandler().run(); +} \ No newline at end of file diff --git a/force-app/main/default/triggers/MembershipContactRoleTrigger.trigger-meta.xml b/force-app/main/default/triggers/MembershipContactRoleTrigger.trigger-meta.xml new file mode 100644 index 00000000..23257e15 --- /dev/null +++ b/force-app/main/default/triggers/MembershipContactRoleTrigger.trigger-meta.xml @@ -0,0 +1,5 @@ + + + 52.0 + Active +