UNKNOWN_EXCEPTION, portal account owner must have a role: In Future Method

apexfuturetrigger

When a contact is created I am trying to create community portal user. So first I wrote the user creation code in trigger itself but I got the error 'MIXED_DML_OPERATION'. So I moved my user creation code to a future method
and my code is like below

Trigger handler Code

public void AfterInsert(List<Sobject> newMap){
        try{
        set<ID> conids = new set<ID>();
            for(Contact c : (List<Contact>) newMap){                
                if(Schema.getGlobalDescribe().get('Contact').getDescribe().getRecordTypeInfosById().get(c.RecordTypeId).getName().toUppercase() =='PROVIDERS'){
                    conids.add(c.id);           
            }  
        }
        
      
        CreateUsers.createCommunityUsers(conids);
        }
        catch(Exception Ex){
         
        }
    }

and here is my Future method class code

public class CreateUsers {
    @future 
    public static void createCommunityUsers(set<Id> setContactids)
    {
        List<contact> conlist = [select id,email,firstName,lastname from Contact where Id IN : setContactids];
       
         List<Profile> profileList = [Select Id from Profile where Name= 'Provider Customer Community Plus User' limit 1];
         List<UserRole> roleList = [Select Id from UserRole where Name= 'Customer Person Account' limit 1];


            List<user> usr = new List<user>();
            Database.DMLOptions dmo = new Database.DMLOptions();
                dmo.EmailHeader.triggerUserEmail = true;       
                dmo.EmailHeader.triggerOtherEmail = true;
                dmo.EmailHeader.triggerAutoResponseEmail = true;       
            
            for(Contact con : conlist){              
                string nick = con.email!=null?con.email.substring(0, con.email.indexOf('@')):''; nick += Datetime.now().getTime();       
                User newUser = new User(
                                alias = con.lastname,
                                email = con.email,
                                emailencodingkey = 'UTF-8',
                                firstname = con.firstName,
                                lastname = con.lastname,
                                languagelocalekey = 'en_US',
                                localesidkey = 'en_US',
                                contactId = con.Id,
                                timezonesidkey = 'America/Los_Angeles',
                                username = con.email+ Datetime.now().getTime(),
                                UserRoleId = roleList[0].Id,
                                CommunityNickname = nick,
                                ProfileId =profileList[0].Id,                           
                                IsActive = true);     
                                newUser.setOptions(dmo);                          
                                usr.add(newUser);        
                }            
            Insert usr;
    }
}

But I am always getting

FIELD_INTEGRITY_EXCEPTION, Invalid role assignment.: 

and if I remove this line of code

  UserRoleId = roleList[0].Id,

I am getting

UNKNOWN_EXCEPTION, portal account owner must have a role

Account record is also mapped properly to that contact
Here is the debug trace


Contact:{Id=0033K00000GlwBJQAZ, [email protected], FirstName=Global, LastName=Test, AccountId=0013K00000kxIf7QAE}


User:{Alias=Test, [email protected], EmailEncodingKey=UTF-8, FirstName=Global, LastName=Test, LanguageLocaleKey=en_US, LocaleSidKey=en_US, ContactId=0033K00000GlwBJQAZ, TimeZoneSidKey=America/Los_Angeles, [email protected], CommunityNickname=solutions1632245022446, ProfileId=00e3K000000E0esQAC, UserRoleId=00E3K000000SRifUAG, IsActive=true}

Best Answer

The error says clearly whats needed

UNKNOWN_EXCEPTION, portal account owner must have a role

So what you need is to make sure the Account owner has a Role assigned and not your portal user.

  1. Find the Accounts of the Contacts records which you are creating experience cloud users.
  2. Find the owner of these Accounts and make sure they have a role assigned.