We have 3 picklist dependent upon each other:
- Category (Mandatory)
- Type (Mandatory)
- Subtype (Not mandatory)
For each picklist, we have lot of picklist values which consumes lot of time mapping via UI. So I was writing metadata api to do mapping of the picklist using excel sheet 3 columns.
I have checked debug log, the Valuesetting to be created are correct only but somehow the metadata is updating category to type dependency correctly but type to subtype dependency is not getting accurate. Only the last record of the excel sheet is mapped in type to subtype dependency. Providing my code below:
@AuraEnabled
public static String createFieldDependency(List<String> documents, String accessToken){
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
MetadataService.AllOrNoneHeader_element allOrNoneHeaderObj = new MetadataService.AllOrNoneHeader_element();
allOrNoneHeaderObj.allOrNone = true;
service.AllOrNoneHeader = allOrNoneHeaderObj;
service.SessionHeader = new MetadataService.SessionHeader_element();
service.SessionHeader.sessionId = accessToken;
List<MetadataService.ValueSettings> caseTypeValueSettingsList = new List<MetadataService.ValueSettings>();
List<MetadataService.ValueSettings> caseSubTypeValueSettingsList = new List<MetadataService.ValueSettings>();
MetadataService.CustomField customFieldCaseType = (MetadataService.CustomField) service.readMetadata('CustomField', new String[] { 'Case.Case_Type__c' }).getRecords()[0];
MetadataService.CustomField customFieldCaseSubType = (MetadataService.CustomField) service.readMetadata('CustomField', new String[] { 'Case.Case_Subcategory__c' }).getRecords()[0];
List<String> categoryToTypeSet = new List<String>();
List<String> typeToSubTypeSet = new List<String>();
ContentVersion cvObj = [SELECT VersionData FROM ContentVersion WHERE ContentDocumentId = :documents[0] AND IsLatest = true];
String csvAsString = cvObj.VersionData.toString();
List<String> csvFileLines = csvAsString.split('\n');
for(Integer i=1; i < csvFileLines.size(); i++){
String[] csvRecordData = csvFileLines[i].split(',');
if(!categoryToTypeSet.contains(csvRecordData[0]+'-----'+csvRecordData[1])){
MetadataService.ValueSettings valueSettingObject1 = new MetadataService.ValueSettings();
valueSettingObject1.controllingFieldValue = new List<String>{csvRecordData[0]};
valueSettingObject1.valueName = csvRecordData[1];
caseTypeValueSettingsList.add(valueSettingObject1);
categoryToTypeSet.add(csvRecordData[0]+'-----'+csvRecordData[1]);
}
if(!String.isBlank(csvRecordData[2]) && !typeToSubTypeSet.contains(csvRecordData[1]+'-----'+csvRecordData[2])){
MetadataService.ValueSettings valueSettingObject2 = new MetadataService.ValueSettings();
valueSettingObject2.controllingFieldValue = new List<String>{csvRecordData[1]};
valueSettingObject2.valueName = csvRecordData[2];
caseSubTypeValueSettingsList.add(valueSettingObject2);
typeToSubTypeSet.add(csvRecordData[1]+'-----'+csvRecordData[2]);
}
}
system.debug('caseSubTypeValueSettingsList > '+caseSubTypeValueSettingsList.size());
customFieldCaseType.valueSet.valueSettings = caseTypeValueSettingsList;
customFieldCaseSubType.valueSet.valueSettings = caseSubTypeValueSettingsList;
system.debug('>>>>>>1> '+customFieldCaseType.valueSet.valueSettings);
system.debug('>>>>>>2> '+customFieldCaseSubType.valueSet.valueSettings);
service.updateMetadata(new MetadataService.Metadata[] { customFieldCaseType,customFieldCaseSubType });
return 'SUCCESS DONE';
}