Skip to main content
1 of 2
user avatar
user avatar

Error Message Question

I'm new to salesforce and am unsure how to approach this error message. I had created this class that rolls down a Contact Role from a Contact created on a Parent to its children and a trigger that executes on creation. It had worked yesterday but when testing it again I now recieve this error message:

Validation Errors While Saving Record(s) There were custom validation error(s) encountered while saving the affected record(s). The first validation error encountered was "Apex trigger LAM_Contact_ReleatedList caused an unexpected exception, contact your administrator: LAM_Contact_ReleatedList: execution of AfterUpdate caused by: System.DmlException: Upsert failed. First exception on row 0; first error: DUPLICATE_VALUE, Contact has already been added in that Contact Role: [ContactId, Role]: Class.LAM_RelatedListUpdate.RollContactRolesToAccountChildren: line 36, column 1".

Would someone be able to explain to me what changed and what to look at to fix this issue? thank you.

Apex Code:

public class LAM_RelatedListUpdate { Public static void RollContactRolesToAccountChildren(List con){ //variables for the account lam record types Id LAMCRecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByName().get('LAM Customer Account').getRecordTypeId();//get recordtypeID of Large Customer Id LAMSRecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByName().get('LAM Site Account').getRecordTypeId();//get recordtypeID of Large Customer Id LAMDRecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByName().get('LAM Division Account').getRecordTypeId() ;//get recordtypeID of Large Customer

    //list of child accounts, parent accounts, contacts and contact roles
    List<Id> accountsFromContacts = new List<Id>();  
    List<Account> parentAccounts = new List<Account>();
    List<Account> listOfAccountChildren = new List<Account>();
    List<AccountContactRole> contactRolesClones = new List<AccountContactRole>();
    
    System.debug(con);
    
    for(contact c : con){
        accountsFromContacts.add(c.AccountId);
    }
    
    parentAccounts = [Select Id, RecordTypeId from Account Where Id = :accountsFromContacts ];
         
    
    listOfAccountChildren = [Select Id, RecordTypeId, Parent_Account_for_LAM__c from Account Where Parent_Account_for_LAM__c = :accountsFromContacts ];
    //updates the contact roles of the child accounts
    for(contact c : con){
        for(Account a : listOfAccountChildren ){
            if(isMatchingRecord(a.Parent_Account_for_LAM__c, parentAccounts) ){
                AccountContactRole cloneConatactRole = new AccountContactRole( AccountId = a.id , ContactId = c.Id,  Role = c.Customer_Role__c  );
                contactRolesClones.add(cloneConatactRole);
            }
        }
    }
    
    
    upsert contactRolesClones;
   
}
//checks that the parent account is of these lam record types, and if the parentId matches the one of the child
public static Boolean isMatchingRecord(Id ParAcc, List<Account> acc){
     Id LAMCRecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByName().get('LAM Customer Account').getRecordTypeId();//get recordtypeID of Large Customer
     Id LAMSRecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByName().get('LAM Site Account').getRecordTypeId();//get recordtypeID of Large Customer
     Id LAMDRecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByName().get('LAM Division Account').getRecordTypeId() ;//get recordtypeID of Large Customer
    for (account a: acc){
        if (a.Id == ParAcc ){
            if(a.recordtypeid == LAMCRecordTypeId  ||  a.recordtypeid == LAMDRecordTypeId || a.recordtypeid == LAMSRecordTypeId){
                return true;
            }
        }
    }
    
    return false;
}

}

Trigger:

trigger LAM_Contact_ReleatedList on Contact (after insert, after update) { LAM_RelatedListUpdate.RollContactRolesToAccountChildren(trigger.new); }

user64312