Monday 29 February 2016

How to create portal user in apex class?

I think we must have faced difficulty to create portal user in apex class. 

Below are the errors we might have faced. 

System.SObjectException: Field is not writeable: User.IsPortalEnabled 
System.SObjectException: Field is not writeable: User.Contact 

This post is just to tell how to create portal user. We already know that first we need to create Contact and Account , ensure the Account is a partner account, then create a user that points to the contact.

Still same error will come. 

Solution-
To make a partner portal account, we need to ensure the account's owner has the correct values in the UserRoleId and ProfileId fields.
To make a partner user, any user is ok. Simply ensure the user's profile is a Portal User profile. Then you can specify a value for its ContactId field.

Below is the code 

//Create portal account owner
UserRole portalRole = [Select Id From UserRole Where PortalType = 'None' Limit 1];
Profile profile1 = [Select Id from Profile where name = 'System Administrator'];
User portalAccountOwner1 = new User(
UserRoleId = portalRole.Id,
ProfileId = profile1.Id,
Username = System.now().millisecond() + 'test2@test.com',
    Alias = 'batman',
Email='bruce.wayne@wayneenterprises.com',
EmailEncodingKey='UTF-8',
Firstname='Bruce',
Lastname='Wayne',
LanguageLocaleKey='en_US',
LocaleSidKey='en_US',
TimeZoneSidKey='America/Chicago'
);
Database.insert(portalAccountOwner1);

//Create account
Account portalAccount1 = new Account(
Name = 'TestAccount',
OwnerId = portalAccountOwner1.Id
);
Database.insert(portalAccount1);
   
//Create contact
Contact contact1 = new Contact(
    FirstName = 'Test',
    Lastname = 'McTesty',
AccountId = portalAccount1.Id,
    Email = System.now().millisecond() + 'test@test.com'
);
Database.insert(contact1);
   
//Create user
Profile portalProfile = [SELECT Id FROM Profile WHERE Name LIKE '%Portal User%' Limit 1];
User user1 = new User(
Username = System.now().millisecond() + 'test12345@test.com',
ContactId = contact1.Id,
ProfileId = portalProfile.Id,
Alias = 'test123',
Email = 'test12345@test.com',
EmailEncodingKey = 'UTF-8',
LastName = 'McTesty',
CommunityNickname = 'test12345',
TimeZoneSidKey = 'America/Los_Angeles',
LocaleSidKey = 'en_US',
LanguageLocaleKey = 'en_US'
);
Database.insert(user1);

3 comments:

Unknown said...

How can you propose this solution as it will throw the Mixed DML error ? Could you please check it.

Asish Kumar Behera said...

We can have future method to insert profile so that mix dml error wont come.

Steve Rogers said...

Nice Blog, Thanks for sharing an amazing information salesforce customer portal