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
Dharmesh MaheshwariDharmesh Maheshwari 

I want To Update the contact if the name is same as at the time of contact Insert and if not then insert the new one. Here is my Code but not working.

public class MergeContact 
{
    public static Boolean runOnce = true;
    
    public void onInsert(List<Contact> lstInsertContactTrigger)
    {
        InsertContact(lstInsertContactTrigger);
    }
    public void onUpdate(List<Contact> lstUpdateContactTrigger, Map<Id,Contact> oldMapTriggerContact)
    {
        UpdateContact(lstUpdateContactTrigger,oldMapTriggerContact);
    }
    private void InsertContact(List<Contact> lstContactInsert)
    {
        List<Contact> lstContactToInsert = new List<Contact>();
        //Set<Id> setContId = new Set<Id>();
        Map<Id,Contact> mapCont = new Map<Id,Contact>();
        for(Contact objContact : lstContactInsert)
        {
            if(objContact.AccountId != null)
            {
                mapCont.put(objContact.AccountId, objContact);
                //setContId.add(objContact.Id);
            }
        }                
        List<Contact> lstContactToCheck = [Select Id, Name, Email, Phone, AccountId, Birthdate, Description, Fax, FirstName, LastName, MailingAddress, MailingCity, MailingState, MailingCountry, MailingPostalCode 
                                           From Contact Where AccountId in : mapCont.keySet()];
        System.debug('List of Existing Contact'+lstContactToCheck);
        for(Contact objContact : lstContactInsert)
        {
            Contact objNewContact = new Contact();
            objNewContact.Id = objContact.Id;
            objNewContact.Email = mapCont.get(objContact.AccountId).Email;
            objNewContact.LastName = mapCont.get(objContact.AccountId).LastName;
            objNewContact.FirstName = mapCont.get(objContact.AccountId).FirstName;
            objNewContact.Phone = mapCont.get(objContact.AccountId).Phone;
            String Name =  objNewContact.FirstName+' '+objNewContact.LastName;
            if(objContact.Name == Name)
            {
                lstContactToCheck.add(objNewContact);
            }
        }
        if(lstContactToInsert.size()>0)
        {
            upsert lstContactToCheck;
        }  
    }
    private void UpdateContact(List<Contact> lstContactUpdate, Map<Id,Contact> oldMapContact)
    {
        List<Contact> lstContactToUpdate = new List<Contact>();
        for(Contact objCon : lstContactUpdate)
        {
            Contact objOldContact = new Contact();
            if(oldMapContact.containsKey(objCon.Id))
            {
                objOldContact.FirstName = oldMapContact.values().FirstName;
                objOldContact.LastName = oldMapContact.values().LastName;
                objOldContact.Email = oldMapContact.values().Email;
                objOldContact.Phone = oldMapContact.values().Phone;
                objOldContact.Birthdate = oldMapContact.values().Birthdate;
                objOldContact.Fax = oldMapContact.values().Fax;
                objOldContact.Description = oldMapContact.values().Description;
                objOldContact.AccountId = oldMapContact.values().AccountId;
                lstContactToUpdate.add(objOldContact);
            }
        }
        if(lstContactToUpdate.size()>0 && runOnce == false)
            update lstContactToUpdate;
    }
}

 
Deepali KulshresthaDeepali Kulshrestha
Hi Dharmesh,

Please use the code below:
//trigger
trigger UpdateDupicateContacts on Contact (after insert) {
    if(Trigger.isAfter&&Trigger.isInsert){
        UpdateDupicateContactsHandler.updateDuplicateContacts(Trigger.new);
        
    }

}

//handler class
public class UpdateDupicateContactsHandler {
    public static void updateDuplicateContacts(List<Contact> contactList){
        try{
            Set<Id> idlist = new Set<Id>();
            for(Contact con :contactList){
                idlist.add(con.id);
            }
            List<Contact> oldContacts = [SELECT Id,LastName,Phone FROM Contact WHERE ID NOT IN :idlist];
            System.debug(oldContacts);
            
            //old Contact Map
            Map<String,Contact> contactMap = new Map<String,Contact>();
            for(Contact con:oldContacts){
                contactMap.put(con.LastName,con);
            }
            System.debug(contactMap);
            
            List<Contact> updateContactList = new List<Contact>();
            List<ID> contactNotToBeInserted = new List<Id>();
            
            for(Contact con : contactList){
                if(contactMap.ContainsKey(con.LastName)){
                    //getting old Contact
                    Contact oldContact = contactMap.get(con.LastName);
                    //I have just updated the Phone field in the contact 
                    // You can add more fields that you want to update 
                    // Don't forget to query the fields in the oldContacts List
                    oldContact.Phone = con.Phone;
                    updateContactList.add(oldContact);
                    contactNotToBeInserted.add(con.Id);
                }
            }
            System.debug(updateContactList);
            System.debug(contactNotToBeInserted);
            
            update updateContactList;
            
            
            List<Contact> deleteList = new List<Contact>();
            deleteList= [SELECT Id,Name FROM Contact WHERE ID In :contactNotToBeInserted];
            
            delete deleteList;
        }catch(Exception e){
            System.debug('Error is ------- > ' + e);
        }
    }
}

I have written the trigger to update the phone field only but you can add more fields as per your requirements.


I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too

Thanks and Regards,
Deepali Kulshrestha
www.kdeepali.com
Dharmesh MaheshwariDharmesh Maheshwari
public class MergeContact 
{
    Set<Id> setContId ;
    Set<Id> setNewContId;
    List<Contact> lstContactToUpdate;
    List<Contact> lstContactToInsert;
    
    public void onInsert(List<Contact> lstInsertContactTrigger)
    {
        InsertContact(lstInsertContactTrigger);
    }
    public void onUpdate(List<Contact> lstInsertContactTrigger)
    {
        UpdateContact(lstInsertContactTrigger);
    }
    
    private void InsertContact(List<Contact> lstContactInsert)
    {
        lstContactToUpdate = new List<Contact>();
        lstContactToInsert = new List<Contact>();
        setContId = new Set<Id>();
        setNewContId = new Set<Id>();
        Set<Id> setAccId = new Set<Id>();
        Map<String,Contact> mapCont = new Map<String,Contact>();
        for(Contact objContact : lstContactInsert)
        {
            if(objContact.AccountId != null)
            {
                setAccId.add(objContact.AccountId);
                setContId.add(objContact.Id);
            }
        }
        System.debug('lstContactInsert'+lstContactInsert);
        List<Contact> lstContactToCheck = new List<Contact>();
        if(setAccId.size()>0 && setContId.size()>0)
        {
            lstContactToCheck = [Select Id, Name, Email, Phone, AccountId, Birthdate, Description, Fax, FirstName, LastName, MailingAddress, MailingCity, MailingState, MailingCountry, MailingPostalCode 
                                 From Contact Where AccountId in : setAccId And Id Not In : setContId];
        }
        
        if(lstContactToCheck.size()>0)
        {
            for(Contact objOldCont : lstContactToCheck)
            {
                mapCont.put(objOldCont.Name, objOldCont);
            }
        }
        System.debug('List of Existing Contact'+lstContactToCheck);
        System.debug('mapCont'+mapCont);
        System.debug('lstContactInsert'+lstContactInsert);
        for(Contact objContact : lstContactInsert)
        {
            String name = objContact.FirstName+' '+objContact.LastName;
            System.Debug('>>>>>>>>>>>nameSyring '+name);
            Contact ObjNewContact = objContact;
            if(mapCont.containsKey(name))
            {
                setNewContId.add(objContact.id);
                System.Debug('>>>>>>>>>>>c1 '+ObjNewContact);
                Contact ObjExistingContact = mapCont.get(Name);
                System.Debug('>>>>>>>>>>>c2 '+ObjExistingContact);
                Map<String, Schema.SObjectField> schemaFieldMap2 = Schema.SObjectType.Contact.fields.getMap();
                for(Schema.SObjectField fieldRef2 : schemaFieldMap2.values()) 
                {
                    Schema.DescribeFieldResult fieldResult2 = fieldRef2.getDescribe();
                    if(fieldResult2.isUpdateable())
                    {
                        String strFieldLabels =fieldResult2.getname();
                        System.debug('>>>>>>>name2'+strFieldLabels);
                        ObjExistingContact.put(fieldResult2.getname(),ObjNewContact.get(strFieldLabels));
                    }
                }
                System.debug('>>>>>updated C2>>>>'+ObjExistingContact);
                lstContactToUpdate.add(ObjExistingContact);
            }
        }
        
        if(lstContactToUpdate.size()>0)
        {
            updateCon();
        }
        
        if(setNewContId.size()>0)
        {
            delCon();    
        }
    }
    
    private void delCon()
    {
        List<Contact> lstContactToDelete = new List<Contact>();
        lstContactToDelete = [Select Id,FirstName,LastName From Contact Where Id In : setContId]; 
        if(lstContactToDelete.size() > 0){
            delete lstContactToDelete;
        }
    }
    
    private void updateCon()
    {
        if(lstContactToUpdate.size() > 0){
            update lstContactToUpdate;  
        }
    }
    private void UpdateContact(List<Contact> lstContactUpdate)
    {
        setContId = new Set<Id>();
        setNewContId = new Set<Id>();
        Set<Id> setAccId = new Set<Id>();
        Map<String,Contact> mapCont = new Map<String,Contact>();
        for(Contact objContact : lstContactUpdate)
        {
            if(objContact.AccountId != null)
            {
                setAccId.add(objContact.AccountId);
                setContId.add(objContact.Id);
            }
        }
        System.debug('lstContactInsert'+lstContactUpdate);
        List<Contact> lstContactToCheck = new List<Contact>();
        if(setAccId.size()>0 && setContId.size()>0)
        {
            lstContactToCheck = [Select Id, Name, Email, Phone, AccountId, Birthdate, Description, Fax, FirstName, LastName, MailingAddress, MailingCity, MailingState, MailingCountry, MailingPostalCode 
                                 From Contact Where AccountId in : setAccId And Id Not In : setContId];
        }
        
        if(lstContactToCheck.size()>0)
        {
            for(Contact objOldCont : lstContactToCheck)
            {
                mapCont.put(objOldCont.Name, objOldCont);
            }
        }
        System.debug('List of Existing Contact'+lstContactToCheck);
        System.debug('mapCont'+mapCont);
        System.debug('lstContactInsert'+lstContactUpdate);
        for(Contact objContact : lstContactUpdate)
        {
            String name = objContact.FirstName+' '+objContact.LastName;
            System.Debug('>>>>>>>>>>>nameSyring '+name);
            Contact ObjNewContact = objContact;
            if(mapCont.containsKey(name))
            {
                setNewContId.add(objContact.id);
                System.Debug('>>>>>>>>>>>c1 '+ObjNewContact);
                Contact ObjExistingContact = mapCont.get(Name);
                System.Debug('>>>>>>>>>>>c2 '+ObjExistingContact);
                Map<String, Schema.SObjectField> schemaFieldMap2 = Schema.SObjectType.Contact.fields.getMap();
                for(Schema.SObjectField fieldRef2 : schemaFieldMap2.values()) 
                {
                    Schema.DescribeFieldResult fieldResult2 = fieldRef2.getDescribe();
                    if(fieldResult2.isUpdateable())
                    {
                        String strFieldLabels =fieldResult2.getname();
                        System.debug('>>>>>>>name2'+strFieldLabels);
                        ObjExistingContact.put(fieldResult2.getname(),ObjNewContact.get(strFieldLabels));
                    }
                }
                System.debug('>>>>>updated C2>>>>'+ObjExistingContact);
                lstContactToUpdate.add(ObjExistingContact);
            }
        }
        if(setNewContId.size()>0)
        {
            delCon();    
        }
    }
}

Hi, I tried this one but It is Not working on Update... Don't know why?