+ Start a Discussion
Melissa FitzgeraldMelissa Fitzgerald 

Apex Trigger for Account Team - UPDATED

We currently have a trigger that was set up by a third party vendor automatically adds an Account Team based on the linked account data of our syncing database.  There is one representaive that the trigger doesn't seem to be recognizing.

I'm unfamiliar with the coding to be able to pin point the issue.  Is there anyone that can point me in the direction of a solution?

trigger AddAccountTeamMembers on Account (after insert,after update){
 //Get User's Name,Id and Store into userMap
   Map<String,Id> userMap=new Map<String,Id>();
   List<Id> userIds= New List<Id>();
   for(User u:[Select id,name from user]){
       userMap.put(u.name,u.id);
       userIds.add(u.Id);
    }
  if(trigger.isInsert && trigger.isAfter){
    Set<Id> repId=new Set<Id>();
    Set<Id> accList=new Set<Id>();
    List<AccountTeamMember> memberList=new List<AccountTeamMember>();   
  //Add account repid and account id's
    for(Account acc : trigger.new){
      repId.add(acc.OASP__OAS_Rep__c);
      accList.add(acc.id);
    }
    Map<id,String> conMap=new Map<id,String>();
  //Query the contacts with account RepId's
    if(repId != null && !repId.isEmpty()){
       for(Contact con: [Select id,name from Contact where Id In:repId]){
          conMap.put(con.id,con.name);
       }
    }
    for(Account acc : trigger.new){
  //Splitting the contacts
     String contactName = conMap.get(acc.OASP__OAS_Rep__c);
     if(contactName!=null){
        List<String> conSplit=contactName.Split(' and ');
  //Add the contacts into Account Team Members
        for(String temp: conSplit){
             AccountTeamMember accMember=new AccountTeamMember();
             accMember.TeamMemberRole='Account Manager';
             accMember.AccountId=acc.id;
             accMember.UserId=(Id)userMap.get(temp);
             memberList.add(accMember);
             
        }
      } 
    } 
    System.debug('++Acc Team Member++'+memberList);
   //insert the contacts and Sharing rules
    if(memberList!=null){
      Database.insert(memberList,false);
    }
    System.debug('++Account List++'+accList);
    //Use future method for Insert Account Share Access
    if(accList != null && accList.size()>0 && memberList.size()>0)
    FutureAccountShare.updateAccountShareAccess(accList);
  }
  if(trigger.isUpdate && trigger.isAfter){
    Set<Id> accId=new Set<Id>();
    Set<Id> repId=new Set<Id>();
    Map<String,AccountTeamMember> accTeamMap = New Map<String,AccountTeamMember>();
    list<AccountTeamMember> accmemlist = New list<AccountTeamMember>();
    list<AccountTeamMember> accteamMembers = New list<AccountTeamMember>();
    Map<id,String> conMap=new Map<id,String>();   
    Set<AccountTeamMember> uniquedelete = new Set<AccountTeamMember>();
    
     for(Account acct: trigger.new){
        accId.add(acct.Id);
        repId.add(acct.OASP__OAS_Rep__c);
     }
     for(Account acct: trigger.old){
        repId.add(acct.OASP__OAS_Rep__c);
     }
     
     For(AccountTeamMember acctmem: [Select id,AccountId,UserId,AccountAccesslevel,TeamMemberRole  from AccountTeamMember where AccountId In: accId]){
          accTeamMap.put(acctmem.AccountId+'&'+acctmem.UserId,acctmem);
          accmemlist.Add(acctmem);
     }
     if(repId != null && !repId.isEmpty()){
       for(Contact con: [Select id,Name from Contact Where ID IN: repId]){
         conMap.put(con.id,con.name);
       }
     }
     Set<Id> accupdateId=new Set<Id>();
     for(Account temp: trigger.New){
      if(temp.OASP__OAS_Rep__c != Trigger.oldMap.get(temp.id).OASP__OAS_Rep__c){
       accupdateId.add(temp.Id);
       for(Id userTemp: userIds){
        String Name = conMap.get(Trigger.oldMap.get(temp.id).OASP__OAS_Rep__c);
        if(Name!=null){
        List<String> contSplitdelete =Name.Split(' and ');
         for(String str: contSplitdelete){
            AccountTeamMember AccmemId = accTeamMap.get(temp.Id+'&'+userMap.get(str)); // 
            if(AccmemId != null) {
              uniquedelete.add(AccmemId);
            }
          }
        }
       }
      } 
     }
     if(uniquedelete!=null){ 
         List<AccountTeamMember> finalDelete = new list<AccountTeamMember>();
         finalDelete.addALL(uniquedelete);
         Database.delete(finalDelete,false);
     }
     List<AccountTeamMember> teamMember=new List<AccountTeamMember>();
        for(Account accUpdate : trigger.new){
        if(accUpdate.OASP__OAS_Rep__c != Trigger.oldMap.get(accUpdate.id).OASP__OAS_Rep__c){
         String contName = conMap.get(accUpdate.OASP__OAS_Rep__c);
          if(contName!=null){
             List<String> contSplit=contName.Split(' and ');
             for(String temp1: contSplit){
                AccountTeamMember acctMember=new AccountTeamMember();
                acctMember.TeamMemberRole='Account Manager';
                acctMember.AccountId=accUpdate.id;
                acctMember.UserId=(Id)userMap.get(temp1);
                teamMember.add(acctMember);          
             }
          }
        } 
        }
     if(teamMember!=null){
     //Insert Account Team Members and Sharing rules for update
      Database.insert(teamMember,false);
     }
 //Use future method for Update Account Share Access
 if(accupdateId != null && accupdateId.size()>0){
    FutureAccountShare.updateAccountShareAccess(accupdateId);
  }
  }
}
prateek jainprateek jain
Hi 
Please, Can you Explain in detail exactly what problem you are facing? if possible with a scenario
Thanks
 
Salesforce DeveloperSalesforce Developer
What is the name of the representative, please check if there are two representative with same name. There is a potential bug in the code if there are two representatives with same name then it wont add the first representative in the Account Team.
Melissa FitzgeraldMelissa Fitzgerald
The representative is the same, but they are differentiated with (WOR) at the end of one of them.