function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Brooks Bruce 47Brooks Bruce 47 

How to account for the possibility that a Hiring Manager for a Position could change?

I've got a trigger which calls a method in a class designed so that the Hiring Manager (lookup field on Position) automatically follows their Positions in Chatter:
 
Class:
public class SubscriptionsClass { 
public static void HiringManagerSubscribeNewPosition(List <Position__c> positions) {
System.Debug('HiringManagerSubscribeNewPosition: Entering');
List <EntitySubscription> subscriptions = new List <EntitySubscription>();
for (Position__c pos :positions) {
EntitySubscription eSubs = new EntitySubscription(parentid = pos.id, subscriberid = pos.Hiring_Manager__c);
subscriptions.add(eSubs);
Database.insert(subscriptions);
}
}
 
Trigger:
trigger PositionTrigger on Position__c (after insert) {
SubscriptionsClass.HiringManagerSubscribeNewPosition(Trigger.new);
}
 
Works great but I can't figure out how to account for the possibility that a Hiring Manager for a Position could change; any ideas? Thanks for any help and advice.
Best Answer chosen by Brooks Bruce 47
Anupama SamantroyAnupama Samantroy
Hi Brooks,

You need to write the trigger for the update as well. Assuming that one position will have one hiring manger please find the code below. If there can be multiple you can create the map as id versus list of subscriptions.
trigger PositionTrigger on Position__c (after insert, after update) {
	SubscriptionsClass.HiringManagerSubscribeNewPosition(Trigger.newMap, Trigger.oldMap);
}

public class SubscriptionsClass { 
	public static void HiringManagerSubscribeNewPosition(Map<Id,Position__c> newPositionsMap,Map<Id,Position__c> oldPositionsMap ) {
		System.Debug('HiringManagerSubscribeNewPosition: Entering');
		List <EntitySubscription> subscriptions = new List <EntitySubscription>();		
		Map<Id,EntitySubscription> mapSubcriptionsForPosition = new Map<Id,EntitySubscription>();
		
		if(oldPositionsMap!=null){
			for(EntitySubscription sub: [Select id, parentid, subscriberid from EntitySubscription where parentid in:oldPositionsMap.keySet()]){
					mapSubcriptionsForPosition.put(parentid,EntitySubscription);
			}
			for (Position__c pos :newPositionsMap.values()) {
				//if new and old hiring managers are different then add the latest
				if(pos.Hiring_Manager__c!= oldPositionsMap.get(pos.Id).Hiring_Manager__c){
					if(mapSubcriptionsForPosition.containsKey(pos.Id)){
						EntitySubscription eSubs = new EntitySubscription(Id = mapSubcriptionsForPosition.get(pos.id).Id, parentid = pos.id, subscriberid = pos.Hiring_Manager__c);
						subscriptions.add(eSubs);
					}
					
				}
							
			}
		}else{
			for (Position__c pos :newPositionsMap.values()) {
				EntitySubscription eSubs = new EntitySubscription(parentid = pos.id, subscriberid = pos.Hiring_Manager__c);
				subscriptions.add(eSubs);			
			}
		}
		
		if(!subscriptions.isEmpty()){
			Database.upsert(subscriptions);
		}
}



Thanks
Anupama

All Answers

Anupama SamantroyAnupama Samantroy
Hi Brooks,

You need to write the trigger for the update as well. Assuming that one position will have one hiring manger please find the code below. If there can be multiple you can create the map as id versus list of subscriptions.
trigger PositionTrigger on Position__c (after insert, after update) {
	SubscriptionsClass.HiringManagerSubscribeNewPosition(Trigger.newMap, Trigger.oldMap);
}

public class SubscriptionsClass { 
	public static void HiringManagerSubscribeNewPosition(Map<Id,Position__c> newPositionsMap,Map<Id,Position__c> oldPositionsMap ) {
		System.Debug('HiringManagerSubscribeNewPosition: Entering');
		List <EntitySubscription> subscriptions = new List <EntitySubscription>();		
		Map<Id,EntitySubscription> mapSubcriptionsForPosition = new Map<Id,EntitySubscription>();
		
		if(oldPositionsMap!=null){
			for(EntitySubscription sub: [Select id, parentid, subscriberid from EntitySubscription where parentid in:oldPositionsMap.keySet()]){
					mapSubcriptionsForPosition.put(parentid,EntitySubscription);
			}
			for (Position__c pos :newPositionsMap.values()) {
				//if new and old hiring managers are different then add the latest
				if(pos.Hiring_Manager__c!= oldPositionsMap.get(pos.Id).Hiring_Manager__c){
					if(mapSubcriptionsForPosition.containsKey(pos.Id)){
						EntitySubscription eSubs = new EntitySubscription(Id = mapSubcriptionsForPosition.get(pos.id).Id, parentid = pos.id, subscriberid = pos.Hiring_Manager__c);
						subscriptions.add(eSubs);
					}
					
				}
							
			}
		}else{
			for (Position__c pos :newPositionsMap.values()) {
				EntitySubscription eSubs = new EntitySubscription(parentid = pos.id, subscriberid = pos.Hiring_Manager__c);
				subscriptions.add(eSubs);			
			}
		}
		
		if(!subscriptions.isEmpty()){
			Database.upsert(subscriptions);
		}
}



Thanks
Anupama
This was selected as the best answer
Brooks Bruce 47Brooks Bruce 47
Thank you!