テストコード内にて、取引先をポータルユーザとして作成したいのだが、個人取引先が有効になっている場合に少しハマったのでメモ。
ポータルユーザとして登録しようとすると、対象のユーザには必ず取引先責任者が紐付いていなければならないよう。 
指定せずに有効化しようとすると以下のようにエラーが出てしまう。
取引先責任者のないポータルユーザは作成できません
しかし個人取引先が有効になっている場合には取引先責任者は使用しないのでどれを指定すればいいのかわからず迷ってしまった。
個人取引先を有効にしている組織の場合、取引先(Account)を作成すると取引先責任者(Contact)が自動的に作成されるよう。
SF上では取引先しか見えていないのだが、Contactでクエリを実行して検索すると、同じ名前のレコードがヒットする。
よって、取引先を作成し、同時に作成される取引先責任者を検索しそれをユーザと紐付けてから、ポータルユーザとして登録してやることで無事、作成することが出来た。
手順としては以下。
- 取引先(Account)を作成
- 取引先責任者(Contact)を取得
- ユーザ(User)を作成
- ポータルユーザとして登録
実際のコードは以下。
ユーザを作成する際のプロフィールは作成済のポータルユーザ用のプロフィールを指定すること。
| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 | @isTest
public with sharing class CreatePortalUserTest {
  static testMethod void create() {
      // 1. 取引先を作成
      Account account = new Account(
                FirstName = '名',
                LastName = '姓'
        );
        insert account;
        
        // 2. 取引先責任者を取得
        Contact contact = [SELECT id,accountId FROM Contact LIMIT 1];
        
        // 3. ユーザを作成
        List<Profile> profiles = [SELECT Id FROM Profile WHERE Name IN ('プロフィール名')];
        User user = New User(
                Username = 'for_apex_test@example.com',
                Email = 'for_apex_test@example.com',
                LastName = '姓',
                Alias = '姓',
                TimeZoneSidKey = 'Asia/Tokyo',
                LocaleSidKey = 'ja_JP',
                EmailEncodingKey = 'ISO-2022-JP',
                ProfileId = profiles.get(0).Id,
                LanguageLocaleKey = 'ja',
                ContactId = contact.Id
        );
        insert user;
        
        // 4. ポータルユーザとして登録
        Site.createPortalUser(user, account.Id, 'password');
        
        
        // 確認
        Account acc = [SELECT id,IsCustomerPortal FROM Account LIMIT 1];
        System.assertEquals(acc.IsCustomerPortal, true);
  }
}
 | 
参考