Friday, 2 August 2013

Contact DeDupe Trigger

//Trigger to prevent duplicate contacts. Matches based on Email.


trigger contactDeDuplicationTrigger on Contact (before insert, before update) {

//Map to store email and contact details
Map> emailConMap = new Map>();

//Your dynamic query
String contactDynamicQuery = 'select Id,Name,Email from Contact' ;

//Typecasting it to map
Map mapCon = new Map((List)Database.query(contactDynamicQuery));

//Looping the map keys to prepare a map for Email and Contact object

for(Id id:mapCon.keySet())
{
    if(emailConMap.get(mapCon.get(id).Email)!=null)
    emailConMap.get(mapCon.get(id).Email).put(Id,mapCon.get(id));
    else
    emailConMap.put(mapCon.get(id).Email, new Map{Id => mapCon.get(id)}); 
}

//Processing records
for(Contact con:trigger.new)
{
    Map tempMap = new Map();
    
    if(emailConMap.get(con.Email)!=null && !emailConMap.get(con.Email).containsKey(con.Id))
    {
        tempMap = emailConMap.get(con.Email);
        String temp = 'Duplicates found:';
        for(Id id:tempMap.keySet())
        temp+=tempMap.get(id).Name+'('+id+'), ';
        
        //Removing last comma
        temp = temp.substring(0,temp.length()-2);
        
        //Adding error to the record
        con.addError(temp);
    }
}
}

No comments:

Post a Comment