You need to sign in to do that
Don't have an account?
Joe 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;
}
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;
}
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
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
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
Can you please check if the related account have a parent account populated.?
Thanks,
Kaustav
Yes, the account is a child account with a related parent account.
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
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!