Apex Plugin - Generic

The support of Duplicate Check's Apex Plugins is only available in our Premium edition

Apex Plugins - Generic Implementation

The generic implementation is new more flexible method of implementing the Duplicate Check apex plugins. The following plugins are implemented.


How to start with the generic apex plugin

Step 1 Implement the Apex Interface

First step is to implement the dupcheck.dc3PluginInterface interface in a custom apex class. You can start with any of the examples below. The minimal implementation is needed at the least.

Step 2 Enable the Apex Class for execution

Duplicate Check needs to know which class to execute. This is done via the DC Setup tab in Salesforce. 
  1. Go to 'DC Setup'
  2. Open the 'Settings'. This can be found in the left menu bar under General Setup. 
  3. Scroll down to the 'Apex Plugins' section. 
  4. Select the defined class in the dropdown for 'Plugin Generic'

Direct Processing Plugin

With the direct processing plugin the standard flow of the direct processing feature can be changed. With the default implementation the direct processing will merge/convert the records when the scoring is above a configured threshold. The custom code within the plugin can make a more informed decision based on the information provided. The plugin can stop the direct processing and just store the result or remove a found duplicate from the result set so it will continue with other records.

Example Implementation of Direct Processing Plugin

    global class DefaultGenericPlugin implements dc3PluginInterface {
    
    private static Set<String> implementedEvents = new Set<String>{'DIRECT_PROCESS_BEFORE'};

    global Boolean isAvailable(dupcheck.dc3Plugin.PluginEventType eventType) {
        return DefaultGenericPlugin.implementedEvents.contains(eventType.name());
    }

    global Object execute(dupcheck.dc3Plugin.PluginEventType eventType, Object eventData) {

            switch on eventType {
                when DIRECT_PROCESS_BEFORE {
                    return this.directProcessBefore((dupcheck.dc3PluginModel.DirectProcessBeforeInput) eventData);
                }
                when else {
                    return null;
                }
            }
	}

    public dupcheck.dc3PluginModel.DirectProcessBeforeOutput directProcessBefore(dupcheck.dc3PluginModel.DirectProcessBeforeInput input) {
     
        // execute some custom logic based on the input values.
        
        // built the output and tell DC Direct Processing how to continue. 
        dupcheck.dc3PluginModel.DirectProcessBeforeOutput output = new dupcheck.dc3PluginModel.DirectProcessBeforeOutput(input);
        return output;

    }
}

Merge Set Master Plugin

With the Merge Set Master plugin there is the possibility to override the selected master record to a record defined via code. The input of the Merge Set Master plugin will contain all relevant information and the Master Record Id defined via the DC Merge Rules.

Example Implementation of Merge Set Master Plugin

    global class DefaultGenericPlugin implements dc3PluginInterface {
    
    private static Set<String> implementedEvents = new Set<String>{'MERGE_SET_MASTER'};

    global Boolean isAvailable(dupcheck.dc3Plugin.PluginEventType eventType) {
        return DefaultGenericPlugin.implementedEvents.contains(eventType.name());
    }

    global Object execute(dupcheck.dc3Plugin.PluginEventType eventType, Object eventData) {

            switch on eventType {
                when MERGE_SET_MASTER {
                    return this.mergeSetMaster((dupcheck.dc3PluginModel.MergeSetMasterInput) eventData);
                }
                when else {
                    return null;
                }
            }
	}

    public dupcheck.dc3PluginModel.MergeSetMasterOutput mergeSetMaster(dupcheck.dc3PluginModel.MergeSetMasterInput input) {

        dupcheck.dc3PluginModel.MergeSetMasterOutput output = new dupcheck.dc3PluginModel.MergeSetMasterOutput(input);
        if (input.objectPrefix == '00Q') {
            for (Sobject ld : input.objectDataList) {
                Lead leadData = (Lead) ld;
                if (leadData.FirstName == 'I WANT TO BE A MASTER') {
                    output.masterRecordId = leadData.Id;
                    break;
                }
            }
        }
        return output;

    }
}

Merge Set Field Plugin

With the Merge Set Field plugin the field selection of a merge can be altered or even custom values can be set for individual fields. The input of the Merge Set Field plugin contains the field selection for each field as this is determined by the DC Merge Rules. In the output it can be defined which field should be taken from which record or if a custom value is needed this value can be set as well.

Example Implementation of Merge Set Field Plugin

    global class DefaultGenericPlugin implements dc3PluginInterface {
    
    private static Set<String> implementedEvents = new Set<String>{'MERGE_SET_FIELD'};

    global Boolean isAvailable(dupcheck.dc3Plugin.PluginEventType eventType) {
        return DefaultGenericPlugin.implementedEvents.contains(eventType.name());
    }

    global Object execute(dupcheck.dc3Plugin.PluginEventType eventType, Object eventData) {

            switch on eventType {
                when MERGE_SET_FIELD {
                    return this.mergeSetField((dupcheck.dc3PluginModel.MergeSetFieldInput) eventData);
                }
                when else {
                    return null;
                }
            }
	}

    public dupcheck.dc3PluginModel.MergeSetFieldOutput mergeSetField(dupcheck.dc3PluginModel.MergeSetFieldInput input) {

        dupcheck.dc3PluginModel.MergeSetFieldOutput output = new dupcheck.dc3PluginModel.MergeSetFieldOutput(input);
        if (input.objectPrefix == '00Q') {

            for (String fieldName : input.fieldSourceMap.keySet()) {

                if (fieldName == 'FirstName') {
                    // Take the FirstName value of the record where the FirstName has a certain value. 
                    for (Sobject objectData : input.objectDataList) {
                        if (String.valueOf(objectData.get(fieldName)) == 'I WANT TO BE TAKEN') {
                            output.fieldSourceMap.put(fieldName, objectData.Id);
                        }
                    }
                } else if (fieldName == 'Website') {
                    // Take the value of the master record
                    output.fieldSourceMap.put(fieldName, input.masterRecordId);
                } else if (fieldName == 'Email') {
                    // Set a custom value for the email field
                    output.fieldSourceMap.put(fieldName, 'custom');
                    output.customValueMap.put(fieldName, 'custom@custom.com');
                } 
            }

        } 
        
        return output;
}

Interface Definition

In order to use the Generic Apex Plugin the following interface should be implemented in an Apex Class.

dupcheck.dc3PluginInterface

Methods

Object execute(dupcheck.dc3Plugin.PluginEventType eventType, Object eventData)
This method will be called to execute the actual plugin.


Boolean isAvailable(dc3Plugin.PluginEventType eventType)
This method will be called to check if a certain plugin is implemented.

Example Minimal Implementation

    global class DefaultGenericPlugin implements dupcheck.dc3PluginInterface {
    
    private static Set<String> implementedEvents = new Set<String>();

    global Boolean isAvailable(dupcheck.dc3Plugin.PluginEventType eventType) {
        return DefaultGenericPlugin.implementedEvents.contains(eventType.name());
    }

    global Object execute(dupcheck.dc3Plugin.PluginEventType eventType, Object eventData) {
        return null;
    }
}

Class Definitions

ENUM dupcheck.dc3Plugin.PluginEventType

This enum will give information which plugin is executed.

DIRECT_PROCESS_BEFORE, MERGE_SET_MASTER, MERGE_SET_FIELD


dupcheck.dc3PluginModel.DirectProcessBeforeInput

This is the input class of the Direct Process plugin. This class will give you the information needed to make informed decisions within the plugin itself.

properties

doConvert Boolean Determines if the 'conversion' is configured for the direct processing
doMerge Boolean Determines if the 'merging' is configured for the direct processing.
feature String the feature which has executed the search and calls the direct processing. 
objectData Sobject Contains the generic Sobject with the source record for this direct processing. 
objectPrefix String The object prefix for this source object. 
searchResults Map<String,List<dupcheck.dc3SearchResults>>> The duplicate search results which will be processed by this direct processing. 

dupcheck.dc3PluginModel.DirectProcessBeforeOutput

This is the output class of the Direct Process plugin. This class will give the direct processing functionality instruction on how to proceed.

properties

doConvert Boolean Should the direct processing process continue with a convert.
doMerge Boolean Should the direct processing process continue with a merge
storeAsJob Boolean If no merge or convert is executed, should the remainder of the results stored inside a DC Job. 
searchResults Map<String,dupcheck.dc3SearchResults>> The duplicate search results which will be processed by this direct processing. 

dupcheck.dc3PluginModel.MergeSetFieldInput

This is the input class of the Merge Set Field plugin. This class will provide the code with the field select determined by the DC Merge Rules.

properties

fieldSourceMap Map<String,String> This map contains the selection per field of the object. The key contains the fieldname and the value contains the Id of the record which is selected for this field. 
masterRecordId String The record Id of the selected master record by the merge rules. 
objectDataList List<Sobject> This lists contains all records in the merge process. 
objectPrefix String The object prefix for the records included in the merge process.

dupcheck.dc3PluginModel.MergeSetFieldOutput

This is the output class of the Merge Set Field plugin. The information provided in this class will determine how the field values of the master record will be after the merge has been executed.

properties

fieldSourceMap Map<String,String> This map contains the selection per field of the object. The key contains the fieldname and the value contains the Id of the record which is selected for this field or a custom value is provided for the field it should contain 'custom'.
customValueMap Map<String,Object> This map contains the custom value for a specific field. The key of the map is the fieldname and the value is a generic object containing the result field value.

dupcheck.dc3PluginModel.MergeSetMasterInput

This is the input class of the Merge Set Master plugin. This class will provide the code with the master record determined by the DC Merge Rules.

properties

masterRecordId String The record Id of the selected master record by the merge rules. 
objectDataList List<Sobject> This lists contains all records in the merge process. 
objectPrefix String The object prefix for the records included in the merge process.

dupcheck.dc3PluginModel.MergeSetMasterOutput

This is the output class of the Merge Set Master plugin. The information provided in this class will determine which record will be the master record will be after the merge has been executed.

properties

masterRecordId String The record Id of the record which should remain as master after the merge.

dupcheck.dc3SearchResult

This class contains the search result for a matching record.

properties

score Integer The matching score between the source record and the object referenced in the objectData
objectData Sobject The object data of the matched record.
scenarioScores List<dupcheck.dc3SearchResult.ScenarioScore> The individual matching scores per DC Scenario

dupcheck.dc3SearchResult.ScenarioScore

This class contains the matching scores for an individual scenario

properties

scenarioScore Integer The matching score between the source record and the object referenced in the objectData for the specified scenario.
scenarioName String The name of the scenario as this can be found in the scenario configuration.
scenarioId Id The Id of the scenario as this can be found in the scenario configurarion
 

Having trouble?

Our support agents are ready to help you !