Sunday, 17 June 2018

Salesforce - Prevent dupilcate Records of a combination of values with a Trigger


trigger SameTypeBrandCheckTrigger on Marketing_Source__c (before insert,before update) {
    //Read custom settings
    Marketing_Source_Trigger_Switch__c ms_switch=Marketing_Source_Trigger_Switch__c.getValues('SameTypeBrandCheckTrigger');
    if(ms_switch!=null
       && ms_switch.isActive__c){
        if(trigger.isbefore){       
            if(trigger.isinsert){
                if(!Test.isRunningTest()){
                    SameTypeBrandCheckTriggerHelper.checkForSameTypeBrand(trigger.new);
                }
            }
            if(trigger.isupdate){
                for(Id mId:trigger.newMap.keyset()){
                    //check for a change in type or brand
                    if(trigger.oldMap.get(mId).Type__c!=trigger.newMap.get(mId).Type__c
                       || trigger.oldMap.get(mId).Brand__c!=trigger.newMap.get(mId).Brand__c){
                           if(!Test.isRunningTest()){ 
                               SameTypeBrandCheckTriggerHelper.checkForSameTypeBrand(trigger.new);
                           }
                       }
                }
            }   
        }
    }
}




Helper class:
=========


/*
    @date: 13/June/2018
    @description: Helper class for SameTypeBrandCheckTrigger to prevent duplicate marketing source records 
                  with same combination of Type and Brand
*/
public class SameTypeBrandCheckTriggerHelper {
    public static void checkForSameTypeBrand(List<Marketing_Source__c> mslist){
        Set<String> typeSet=new Set<String>();
        Set<String> brandSet=new Set<String>();
        //Add new type and brand
        for(Marketing_Source__c ms:mslist){
            typeSet.add(ms.Type__c);
            brandSet.add(ms.Brand__c);
        }
        //Prepare a map with same combination
        Map<Id,Marketing_Source__c> dupTypeBrandMap=new Map<Id,Marketing_source__c>([SELECT Id, Name, Type__c, Brand__c
                                                                                    FROM Marketing_Source__c 
                                                                                    WHERE Type__c IN:typeSet
                                                                                    AND Brand__c IN:brandSet]);
        //Check for duplicates
        for(Marketing_Source__c ms:mslist){
            Marketing_Source__c dupms=isExistsWithSameBrandAndType(ms,dupTypeBrandMap);
            if(dupms!=null){
                ms.addError('Same Type, Brand Combination already given to <a href=\'/'+dupms.Id+'\'>'+dupms.Name+'</a>',false);
            }
        }        
    }
    public static Marketing_Source__c isExistsWithSameBrandAndType(Marketing_Source__c p_ms,Map<Id,Marketing_Source__c> p_dupTypeBrandMap){
        Marketing_Source__c dupm=null;
        for(Id mId:p_dupTypeBrandMap.keySet()){
            //check for amatch
            if(p_ms.Type__c.equals(p_dupTypeBrandMap.get(mId).Type__c)
               && p_ms.Brand__c.equals(p_dupTypeBrandMap.get(mId).Brand__c)){
                dupm=p_dupTypeBrandMap.get(mId);
                break;
            }
        }
        return dupm;
    }
}


No comments:

Post a Comment