public inherited sharing class CreateOriginPicklistItem { public class Request { @InvocableVariable(required=true label='Picklist Item Name') public String picklistItemName; } public class Result { @InvocableVariable(label='Case Origin') public String caseOrigin; @InvocableVariable(label='Created') public Boolean created; @InvocableVariable(label='Metadata Full Name') public String metadataFullName; } @InvocableMethod( label='Create Origin Picklist Item' description='Adds a value to the Case Origin standard value set when it does not already exist.' category='Queue Configuration' callout=true ) public static List createOrigin(List requests) { MetadataXml.require( requests != null && requests.size() == 1, 'Create Origin Picklist Item accepts exactly one request per invocation.' ); String label = requests[0].picklistItemName == null ? null : requests[0].picklistItemName.trim(); MetadataXml.require( !String.isBlank(label), 'Picklist Item Name is required.' ); String developerName = MetadataXml.developerName(label); Dom.XmlNode valueSet = MetadataApiClient.readMetadata( 'StandardValueSet', 'CaseOrigin' ); MetadataXml.require( valueSet != null, 'The CaseOrigin standard value set was not found.' ); for ( Dom.XmlNode valueNode : MetadataXml.children(valueSet, 'standardValue') ) { String existingName = MetadataXml.text(valueNode, 'fullName'); String existingLabel = MetadataXml.text(valueNode, 'label'); if ( label.equalsIgnoreCase(existingLabel) || developerName.equalsIgnoreCase(existingName) ) { if ( developerName.equalsIgnoreCase(existingName) && !label.equalsIgnoreCase(existingLabel) ) { throw new IllegalArgumentException( 'Case Origin developer name ' + developerName + ' is already used by the label "' + existingLabel + '".' ); } return new List{ result(existingName, false) }; } } String newValueXml = '' + MetadataXml.escape(developerName) + 'false'; MetadataApiClient.updateMetadata( 'StandardValueSet', MetadataXml.serializeChildren(valueSet) + newValueXml ); return new List{ result(developerName, true) }; } private static Result result(String caseOrigin, Boolean created) { Result value = new Result(); value.caseOrigin = caseOrigin; value.created = created; value.metadataFullName = 'CaseOrigin'; return value; } }