So what if you work for an organization where Account reassignment tasks are handled in mass or they are handled by some Salesforce integration? Unless the admin performing the mass updates is explicitly updating the related records or there is code in the integration explicitly reassigning the records, the related Contacts and Opportunities are remaining assigned to the old Account Owner.
That's why I wrote the following trigger. It will perform the ownership update for related Contacts and Opportunities when the Owner of the associated Account is updated.
For some security might be a concern sending the data via URL parameters.
Up to this point, I have not been able to confirm if Google is officially supporting SSL connections to rectify this problem. However the following seems to be fine
trigger reassignRelatedContactsAndOpportunities on Account (after update) { try { SetaccountIds = new Set (); //set for holding the Ids of all Accounts that have been assigned to new Owners Map oldOwnerIds = new Map (); //map for holding the old account ownerId Map newOwnerIds = new Map (); //map for holding the new account ownerId Contact[] contactUpdates = new Contact[0]; //Contact sObject to hold OwnerId updates Opportunity[] opportunityUpdates = new Opportunity[0]; //Opportunity sObject to hold OwnerId updates for (Account a : Trigger.new) { //for all records if (a.OwnerId != Trigger.oldMap.get(a.Id).OwnerId) { oldOwnerIds.put(a.Id, Trigger.oldMap.get(a.Id).OwnerId); //put the old OwnerId value in a map newOwnerIds.put(a.Id, a.OwnerId); //put the new OwnerId value in a map accountIds.add(a.Id); //add the Account Id to the set } } if (!accountIds.isEmpty()) { //if the accountIds Set is not empty for (Account act : [SELECT Id, (SELECT Id, OwnerId FROM Contacts), (SELECT Id, OwnerId FROM Opportunities WHERE IsClosed = False) FROM Account WHERE Id in :accountIds]) { //SOQL to get Contacts and Opportunities for updated Accounts String newOwnerId = newOwnerIds.get(act.Id); //get the new OwnerId value for the account String oldOwnerId = oldOwnerIds.get(act.Id); //get the old OwnerId value for the account for (Contact c : act.Contacts) { //for all contacts if (c.OwnerId == oldOwnerId) { //if the contact is assigned to the old account Owner Contact updatedContact = new Contact(Id = c.Id, OwnerId = newOwnerId); //create a new Contact sObject contactUpdates.add(updatedContact); //add the contact to our List of updates } } for (Opportunity o : act.Opportunities) { //for all opportunities if (o.OwnerId == oldOwnerId) { //if the opportunity is assigned to the old account Owner Opportunity updatedOpportunity = new Opportunity(Id = o.Id, OwnerId = newOwnerId); //create a new Opportunity sObject opportunityUpdates.add(updatedOpportunity); //add the opportunity to our List of updates } } } update contactUpdates; //update the Contacts update opportunityUpdates; //update the Opportunities } } catch(Exception e) { //catch errors System.Debug('reassignRelatedContactsAndOpportunities failure: '+e.getMessage()); //write error to the debug log } }
The code itself is fairly straightforward. If your Users/Admins elect to perform one-off Account ownership changes via the Salesforce GUI then the regular functionality still applies. This code simply keeps you covered when performing Account assignment changes in another manner.
-greg
No comments:
Post a Comment