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
Joe StolzJoe Stolz 

Trigger to copy Parent Account Team to Child Account Opportunity Team

We have a number of different opportunity teams and they vary by parent account. I found and customized a trigger to copy the account team (Which we do not use for sales tracking purposes) to the opportunity team. This works perfectly, but we want this as automated as possible. What I would like to do is have the Parent Account Team copied to the Child Account Opportunity Team. Could someone help me out with this?

Here is the code I am using to copy the Child Account Team to the Opportunity Team:

trigger SetOpportunityTeam on Opportunity (after insert) {
List<OpportunityTeamMember> oppTeamMembersList = new List<OpportunityTeamMember>();

Map< Id , Id > opportunityIdToAccountId = new Map< Id , Id >();
for(Opportunity o : Trigger.new)  {
    if(o.StageName == 'Qualification_RPA')   {
        opportunityIdToAccountId.put(o.Id,  o.AccountId );
    }
}


Map<id, List<AccountTeamMember > > accountIdToAccountTeamMembers = new    Map<id,  List<AccountTeamMember > > ();
for(AccountTeamMember accountTeamMember : [SELECT a.UserId,a.User.Name,a.TeamMemberRole, a.Id, a.AccountId
                        FROM AccountTeamMember a
                        WHERE a.TeamMemberRole IN ('National Operations Manager','Account Coordinator','National Account Manager','Sales Leader','Director of Account Management','Director of Operations') AND
                        a.AccountId in :opportunityIdToAccountId.values() ])   {

        List<AccountTeamMember > accountTeamMembers = ( accountIdToAccountTeamMembers.get(accountTeamMember.Accountid) == null) ?
                                                       new  List<AccountTeamMember >() :
                                                       accountIdToAccountTeamMembers.get(accountTeamMember.Accountid);

        accountTeamMembers.add(accountTeamMember);
        accountIdToAccountTeamMembers.put(accountTeamMember.Accountid, accountTeamMembers);

}



for(Opportunity o : Trigger.new) {
    if(o.StageName == 'Qualification_RPA')   {
        Id accountId  = opportunityIdToAccountId.get(o.Id);
        for ( AccountTeamMember accountTeamMember : accountIdToAccountTeamMembers.get(accountId) )  {
            OpportunityTeamMember opportunityTeamMember  = new OpportunityTeamMember();
            opportunityTeamMember.UserId = accountTeamMember.UserId;
            opportunityTeamMember.TeamMemberRole = accountTeamMember.TeamMemberRole;
            opportunityTeamMember.OpportunityId = o.ID;
            oppTeamMembersList.add(opportunityTeamMember);
        }
     }
}

insert oppTeamMembersList;
}
Best Answer chosen by Joe Stolz
kaustav goswamikaustav goswami
Hi Joe,

Made some more modifications and works in my dev org. Let me know if there are further issues.

trigger SetOpportunityTeam on Opportunity (after insert) {
List<OpportunityTeamMember> oppTeamMembersList = new List<OpportunityTeamMember>();

Map< Id , Id > opportunityIdToAccountId = new Map< Id , Id >();
Map< Id , Id > opportunityIdToParAccountId = new Map< Id , Id >();

for(Opportunity o : Trigger.new)  {
    if(o.StageName == 'Qualification_RPA')   {
        opportunityIdToAccountId.put(o.Id,  o.AccountId );
    }
}
System.debug('#### opportunityIdToAccountId #### ' + opportunityIdToAccountId);

Map<Id, Account> mapIdToAcc = new Map<Id, Account>([SELECT Id, ParentId FROM Account WHERE Id IN :opportunityIdToAccountId.values()]);
System.debug('#### results of acc query #### ' + mapIdToAcc);
for(Id oppId : opportunityIdToAccountId.keySet()){
Id accId = opportunityIdToAccountId.get(oppId);
Id parId = mapIdToAcc.get(accId).ParentId;
opportunityIdToParAccountId.put(oppId,parId);
}
System.debug('#### opp to parent acc #### ' + opportunityIdToParAccountId);

Map<id, List<AccountTeamMember > > accountIdToAccountTeamMembers = new    Map<id,  List<AccountTeamMember > > ();
for(AccountTeamMember accountTeamMember : [SELECT a.UserId,a.User.Name,a.TeamMemberRole, a.Id, a.AccountId
                        FROM AccountTeamMember a WHERE a.TeamMemberRole IN ('National Operations Manager','Account Coordinator','National Account Manager','Sales Leader','Director of Account Management','Director of Operations') AND a.AccountId in :opportunityIdToParAccountId.values() ])   {
 
  System.debug('#### accountTeam member #### ' + accountTeamMember);
        List<AccountTeamMember > accountTeamMembers = ( accountIdToAccountTeamMembers.get(accountTeamMember.Accountid) == null) ?
                                                       new  List<AccountTeamMember >() :
                                                       accountIdToAccountTeamMembers.get(accountTeamMember.Accountid);

        accountTeamMembers.add(accountTeamMember);
        accountIdToAccountTeamMembers.put(accountTeamMember.Accountid, accountTeamMembers);

}
System.debug('#### accountIdToAccountTeamMembers #### ' + accountIdToAccountTeamMembers);


for(Opportunity o : Trigger.new) {
    if(o.StageName == 'Qualification_RPA')   {
        Id accountId  = opportunityIdToParAccountId.get(o.Id);
        for ( AccountTeamMember accountTeamMember : accountIdToAccountTeamMembers.get(accountId) )  {
            OpportunityTeamMember opportunityTeamMember  = new OpportunityTeamMember();
            opportunityTeamMember.UserId = accountTeamMember.UserId;
            opportunityTeamMember.TeamMemberRole = accountTeamMember.TeamMemberRole;
            opportunityTeamMember.OpportunityId = o.ID;
            oppTeamMembersList.add(opportunityTeamMember);
        }
     }
}

insert oppTeamMembersList;
}

Thanks,
Kaustav

All Answers

kaustav goswamikaustav goswami
Hi,

I have modified the trigger to include the team members from the parent account. Please use this and let me know if this works.

trigger SetOpportunityTeam on Opportunity (after insert) {
List<OpportunityTeamMember> oppTeamMembersList = new List<OpportunityTeamMember>();

Map< Id , Id > opportunityIdToParAccountId = new Map< Id , Id >();
for(Opportunity o : Trigger.new)  {
    if(o.StageName == 'Qualification_RPA')   {
        opportunityIdToParAccountId.put(o.Id,  o.Account.ParentId ); // create a map between opp id and related account's parent id
    }
}


Map<id, List<AccountTeamMember > > accountIdToAccountTeamMembers = new    Map<id,  List<AccountTeamMember > > ();
for(AccountTeamMember accountTeamMember : [SELECT a.UserId,a.User.Name,a.TeamMemberRole, a.Id, a.AccountId
                        FROM AccountTeamMember a
                        WHERE a.TeamMemberRole IN ('National Operations Manager','Account Coordinator','National Account Manager','Sales Leader','Director of Account Management','Director of Operations') AND
                        a.AccountId in :opportunityIdToParAccountId.values() ])   { // changed the clause to fetch the parent account's team members

        List<AccountTeamMember > accountTeamMembers = ( accountIdToAccountTeamMembers.get(accountTeamMember.Accountid) == null) ?
                                                       new  List<AccountTeamMember >() :
                                                       accountIdToAccountTeamMembers.get(accountTeamMember.Accountid);

        accountTeamMembers.add(accountTeamMember);
        accountIdToAccountTeamMembers.put(accountTeamMember.Accountid, accountTeamMembers);

}



for(Opportunity o : Trigger.new) {
    if(o.StageName == 'Qualification_RPA')   {
        Id accountId  = opportunityIdToParAccountId.get(o.Id);
        for ( AccountTeamMember accountTeamMember : accountIdToAccountTeamMembers.get(accountId) )  {
            OpportunityTeamMember opportunityTeamMember  = new OpportunityTeamMember();
            opportunityTeamMember.UserId = accountTeamMember.UserId;
            opportunityTeamMember.TeamMemberRole = accountTeamMember.TeamMemberRole;
            opportunityTeamMember.OpportunityId = o.ID;
            oppTeamMembersList.add(opportunityTeamMember);
        }
     }
}

insert oppTeamMembersList;
}

Thanks,
Kaustav
Joe StolzJoe Stolz
Thank you very much. This seems to be working. I will keep testing it, but so far it is preforming perfectly.
Joe StolzJoe Stolz
I spoke to soon. This error is coming up when I try to save an opportunity:

Apex trigger SetOpportunityTeam caused an unexpected exception, contact your administrator: SetOpportunityTeam: execution of AfterInsert caused by: System.NullPointerException: Attempt to de-reference a null object: Trigger.SetOpportunityTeam: line 32, column 1
kaustav goswamikaustav goswami
Hi Joe,

Can you please check if the related account have a parent account populated.?

Thanks,
Kaustav
Joe StolzJoe Stolz
Thank you for your help Kaustav.

Yes, the account is a child account with a related parent account.


kaustav goswamikaustav goswami
Hi Joe,

Made some more modifications and works in my dev org. Let me know if there are further issues.

trigger SetOpportunityTeam on Opportunity (after insert) {
List<OpportunityTeamMember> oppTeamMembersList = new List<OpportunityTeamMember>();

Map< Id , Id > opportunityIdToAccountId = new Map< Id , Id >();
Map< Id , Id > opportunityIdToParAccountId = new Map< Id , Id >();

for(Opportunity o : Trigger.new)  {
    if(o.StageName == 'Qualification_RPA')   {
        opportunityIdToAccountId.put(o.Id,  o.AccountId );
    }
}
System.debug('#### opportunityIdToAccountId #### ' + opportunityIdToAccountId);

Map<Id, Account> mapIdToAcc = new Map<Id, Account>([SELECT Id, ParentId FROM Account WHERE Id IN :opportunityIdToAccountId.values()]);
System.debug('#### results of acc query #### ' + mapIdToAcc);
for(Id oppId : opportunityIdToAccountId.keySet()){
Id accId = opportunityIdToAccountId.get(oppId);
Id parId = mapIdToAcc.get(accId).ParentId;
opportunityIdToParAccountId.put(oppId,parId);
}
System.debug('#### opp to parent acc #### ' + opportunityIdToParAccountId);

Map<id, List<AccountTeamMember > > accountIdToAccountTeamMembers = new    Map<id,  List<AccountTeamMember > > ();
for(AccountTeamMember accountTeamMember : [SELECT a.UserId,a.User.Name,a.TeamMemberRole, a.Id, a.AccountId
                        FROM AccountTeamMember a WHERE a.TeamMemberRole IN ('National Operations Manager','Account Coordinator','National Account Manager','Sales Leader','Director of Account Management','Director of Operations') AND a.AccountId in :opportunityIdToParAccountId.values() ])   {
 
  System.debug('#### accountTeam member #### ' + accountTeamMember);
        List<AccountTeamMember > accountTeamMembers = ( accountIdToAccountTeamMembers.get(accountTeamMember.Accountid) == null) ?
                                                       new  List<AccountTeamMember >() :
                                                       accountIdToAccountTeamMembers.get(accountTeamMember.Accountid);

        accountTeamMembers.add(accountTeamMember);
        accountIdToAccountTeamMembers.put(accountTeamMember.Accountid, accountTeamMembers);

}
System.debug('#### accountIdToAccountTeamMembers #### ' + accountIdToAccountTeamMembers);


for(Opportunity o : Trigger.new) {
    if(o.StageName == 'Qualification_RPA')   {
        Id accountId  = opportunityIdToParAccountId.get(o.Id);
        for ( AccountTeamMember accountTeamMember : accountIdToAccountTeamMembers.get(accountId) )  {
            OpportunityTeamMember opportunityTeamMember  = new OpportunityTeamMember();
            opportunityTeamMember.UserId = accountTeamMember.UserId;
            opportunityTeamMember.TeamMemberRole = accountTeamMember.TeamMemberRole;
            opportunityTeamMember.OpportunityId = o.ID;
            oppTeamMembersList.add(opportunityTeamMember);
        }
     }
}

insert oppTeamMembersList;
}

Thanks,
Kaustav
This was selected as the best answer
Joe StolzJoe Stolz
Perfect. Thank you again for your help Kaustav. The Salesforce community continues to amaze me.
Swathi Karkala 7Swathi Karkala 7
@Kastav Goswani,

Can you please let me know if you worked on copying Parent account team members to Child account team members. I was trying to use your code to work on Parent to child account team members but I was unsuccessful. Can you please share the code if you have worked on it? That would be a great help. 

Thanks!