function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Dave The RaveDave The Rave 

Run Case Assignment rules from Apex

All,

Below is some existing code which assigns cases to SF queues. Please look at the code starting from : //get needed queue here and assign ownership of case.

I know have to expand this code for over 200 countries and 15 queues.

We already use the SF Case Assignment Rules for other purposes, I have read that you can run these rules from apex, but I am not sure how to incorporate this into the code below (which I did not write, I am an admin).

Can someone help me to amend my code?
 
global class EmailToCaseHandler implements Messaging.InboundEmailHandler {

    global Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail email, Messaging.InboundEnvelope envelope) {
        System.debug('handleInboundEmail');

        List<WebToCaseSetting__mdt> caseSettings = [
                Select Id, IsActive__c, WebCountry__c, WebOrigin__c
                FROM
                        WebToCaseSetting__mdt
                WHERE IsActive__c = TRUE
        ];

        Map<String, String> caseSettingsMap = new Map<String, String>();

        for (WebToCaseSetting__mdt webToCaseSetting : caseSettings) {
            caseSettingsMap.put(webToCaseSetting.WebCountry__c, webToCaseSetting.WebOrigin__c);
        }

        Messaging.InboundEmailResult result = new Messaging.InboundEmailresult();
//        // Remove HTML tags from email body
        String emailBodyString = email.htmlBody.stripHtmlTags();
        System.debug('eBs -> ' + emailBodyString);
        System.debug('from -> ' + email.fromAddress);
        System.debug('to -> ' + email.toAddresses);
        // Split here email body by lines
        List<String> caseRawInfo = email.htmlBody.stripHtmlTags().split('\n');

        Map<String, String> caseInfo = new Map<String, String>();
        //populating map field name by value
        for (String s : caseRawInfo) {
            caseInfo.put(s.substringBefore(': '), s.substringAfter(': '));
            /* string key = s.substringBefore(': ');
             string value= s.substringAfter(': ');
             system.debug('Key-->'+key+'--Value'+value); */
        }

        for (String key : caseInfo.keySet()) {
            system.debug('caseInfo.' + key + ' => ' + caseInfo.get(key));
        }
        System.debug('caseInfo --> ' + caseInfo);
        // Map Keys, values on left are Salesforce fields, values on right are field value from CMS form workflow

        //new
        String websiteOrigin;
        if(caseInfo.get('websiteOrigin') != null && caseInfo.get('websiteOrigin') != ''){
            websiteOrigin = caseInfo.get('websiteOrigin').toLowerCase().normalizeSpace();
        }else {
            websiteOrigin = 'abc.' + caseInfo.get('webCountry').toLowerCase().normalizeSpace();
        }

        System.debug('websiteOrigin after -> ' + websiteOrigin);
//

        Case caseToCreate = new Case(
                SuppliedName = caseInfo.get('name'),
                SuppliedFirstname__c = caseInfo.get('webFirstname'),
                SuppliedLastname__c = caseInfo.get('webLastname'),
                SuppliedCompany = caseInfo.get('company'),
                WebStreet__c = caseInfo.get('webStreet'),
                WebStreetNumber__c = caseInfo.get('webStreetNumber'),
                WebStreetNumberSuffix__c = caseInfo.get('webStreetNumberSuffix'),
                WebPostcode__c = caseInfo.get('webPostcode'),
                ShippingDistrict__c = caseInfo.get('webDistrict'),
                SuppliedPhone = caseInfo.get('phone'),
                WebCity__c = caseInfo.get('webCity'),
                SuppliedEmail = caseInfo.get('email'),
                WebDistributor__c = caseInfo.get('webDistributor'),
                WebDistributorDE__c = caseInfo.get('webDistributorDE'),
                WebCountry__c = caseInfo.get('webCountry'),
                OptInPerson__c = Boolean.valueOf(caseInfo.get('optinperson').replaceAll('\\s+', '')),
                WebsiteOrigin__c = websiteOrigin,
                WebProduct__c = caseInfo.get('webProduct'),
                WebDistributorCity__c = caseInfo.get('webDistributorCity'),
                ProductLotcode__c = caseInfo.get('productLotcode'),
                PackagingAvailable__c = Boolean.valueOf(caseInfo.get('packagingAvailable').replaceAll('\\s+', '')),
                BestBeforeDateString__c = caseInfo.get('bestBeforeDateString'),
                //for description order is important in umbraco workflow, it should be before optinperson
                Description = emailBodyString.substringAfter('description: ').substringBefore('optinperson'),
                Subject = caseInfo.get('recordType') + ' - ' + caseInfo.get('webProduct'),
                Type = caseInfo.get('type'),
                Priority = 'Medium',
                Status = 'New',
                Stage__c = 'New',
                Origin = 'Web'
        );

        //get needed queue here and assign ownership of case
       Map<String, Id> mapQueueNameId = new Map<String, Id>();
        List<Group> queues = [SELECT Id, DeveloperName FROM Group WHERE Type = 'Queue'];
        for (Group queue : queues) {
            mapQueueNameId.put(queue.DeveloperName, queue.Id);
        }

        if (caseInfo.get('webCountry').normalizeSpace() == 'RO') {
            setCaseOwner(caseToCreate, mapQueueNameId, 'Balkans');
        }
        if (caseInfo.get('webCountry').normalizeSpace() == 'HU') {
            setCaseOwner(caseToCreate, mapQueueNameId, 'Hungary');
        }

        if (caseInfo.get('webCountry').normalizeSpace() == 'DE') {
            setCaseOwner(caseToCreate, mapQueueNameId, 'Germany');
        }
        if (caseInfo.get('webCountry').normalizeSpace() == 'PL') {
            setCaseOwner(caseToCreate, mapQueueNameId, 'Trade_CSC_Aviko_Poland');
        }
        if (caseInfo.get('webCountry').normalizeSpace() == 'CZ') {
            setCaseOwner(caseToCreate, mapQueueNameId, 'Czech_Slovakia');
        }
        if (caseInfo.get('webCountry').normalizeSpace() == 'RU') {
            setCaseOwner(caseToCreate, mapQueueNameId, 'Russia_CIS');
            }
        if (caseInfo.get('webCountry').normalizeSpace() == 'US') {
            setCaseOwner(caseToCreate, mapQueueNameId, 'North_America');
        }
        if (caseInfo.get('webCountry').normalizeSpace() == 'NL') {
            if (websiteOrigin == 'abc.nl') {
                setCaseOwner(caseToCreate, mapQueueNameId, 'Nederland');
            }
        }

        String recordType = caseInfo.get('recordType').replaceAll('\\s+', '');

        if (recordType != null) {
            //get record type Id if it was defined in email body
            Id recordTypeId = Schema.SObjectType.Case.getRecordTypeInfosByName().get(recordType).getRecordTypeId();

            if (recordTypeId != null) {
                caseToCreate.RecordTypeId = recordTypeId;
            }
        }

        String contactEmail = caseInfo.get('email').replaceAll('\\s+', '');

        if (contactEmail != null) {
            // looking for a matching contact here
            List<Contact> contactWithSameEmail = [Select Id From Contact Where Email = :contactEmail Limit 1];

            if (!contactWithSameEmail.isEmpty()) {
                caseToCreate.ContactId = contactWithSameEmail[0].Id;
            }
        }
        system.debug('caseToCreate => ' + caseToCreate);
        insert caseToCreate;

        // checking if email contains attachments
        if (email.binaryAttachments != null && !email.binaryAttachments.isEmpty()) {
            ContentVersion cv = new ContentVersion(
                    Title = email.binaryAttachments[0].fileName,
                    PathOnClient = email.binaryAttachments[0].fileName,
                    VersionData = email.binaryAttachments[0].body,
                    IsMajorVersion = false
            );
            // Create attachment with adding all needed info from email
            insert cv;

            // Creating document Link to connect this attachment with our case
            ContentDocumentLink docLink = new ContentDocumentLink();
            docLink.ContentDocumentId = [SELECT ContentDocumentId FROM ContentVersion WHERE Id = :cv.Id LIMIT 1].ContentDocumentId;
            docLink.LinkedEntityId = caseToCreate.Id;
            docLink.ShareType = 'V';

            insert docLink;
        }

        result.success = true;
        return result;
    }

    private static void setCaseOwner(Case caseToCreate, Map<String, Id> mapQueueNameId, String queueName) {
        if (mapQueueNameId.containsKey(queueName)) {
            caseToCreate.OwnerId = mapQueueNameId.get(queueName);
        }
    }

}
Googled this answer:

https://help.salesforce.com/s/articleView?id=000338182&type=1
 
Best Answer chosen by Dave The Rave
anvesh jaianvesh jai
  1. //Fetching the assignment rules on case
  2. AssignmentRule AR = new AssignmentRule();
  3. AR = [select id from AssignmentRule where SobjectType = 'Case' and Active = true limit 1];
  4. //Creating the DMLOptions for "Assign using active assignment rules" checkbox
  5. Database.DMLOptions dmlOpts = new Database.DMLOptions();
  6. dmlOpts.assignmentRuleHeader.assignmentRuleId= AR.id;
  7. Case newCase = new Case(Status = 'New') ;
  8. //Setting the DMLOption on Case instance
  9. newCase.setOptions(dmlOpts);
  10. insert newCase ;
The above piece of code is fetching the active assignment rule of Case and then creating the DMLOptions for the "Assign using active assignment rules" checkbox. Actually Database.DMLOptions class provides advanced information.
So now when the Case is inserted through Apex with the Database.DMLOptions, the assignment rule gets invoked easily.

192.168.1.1 (http://19216811.support/)