public class SmePermissionSetAssignmentQueueable implements Queueable { private Set userIds; public SmePermissionSetAssignmentQueueable(Set userIds) { this.userIds = userIds; } public void execute(QueueableContext context) { if(userIds == null || userIds.isEmpty()) return; List psList = [ SELECT Id FROM PermissionSet WHERE Name = 'Shopify_Made_Easy_Modify_All' LIMIT 1 ]; if(psList.isEmpty()) return; Id psId = psList[0].Id; Set eligibleUserIds = new Set(); for(User u : [ SELECT Id FROM User WHERE Id IN :userIds AND IsActive = true AND UserType = 'Standard' ]) { eligibleUserIds.add(u.Id); } if(eligibleUserIds.isEmpty()) return; Set alreadyAssignedUsers = new Set(); for(PermissionSetAssignment psa : [ SELECT AssigneeId FROM PermissionSetAssignment WHERE AssigneeId IN :eligibleUserIds AND PermissionSetId = :psId ]) { alreadyAssignedUsers.add(psa.AssigneeId); } List psaList = new List(); for(Id userId : eligibleUserIds) { if(!alreadyAssignedUsers.contains(userId)) { psaList.add(new PermissionSetAssignment( AssigneeId = userId, PermissionSetId = psId )); } } if(!psaList.isEmpty()) { Database.SaveResult[] results = Database.insert(psaList, false); for(Integer i = 0; i < results.size(); i++) { if(!results[i].isSuccess()) { System.debug(LoggingLevel.WARN, 'PermissionSetAssignment failed for AssigneeId=' + psaList[i].AssigneeId + ' errors=' + results[i].getErrors()); } } } } public static void assignPermissionSet(Set userIds) { System.enqueueJob( new SmePermissionSetAssignmentQueueable(userIds) ); } }