以前、クイックアクションでケース作成時に割り当てルールが適用されないことについて記事で紹介しました。
この現象は、Apexでケース作成時にも起こるそうです。しかし、Apexでのケース作成時に関しては、解決法がありました。
また、割り当てルールは複数ルールを作成できても一つのルールしか有効化することができません。こちらも、今回紹介するプロパティを使えばApex上で有効化していない割り当てルールを適用することができます。
今回はその二つについて紹介いたします!
※今回はケースについての解決法を書いていますが、リードの割り当てルール適用時も同じ実装になります。
解決法
今回実装で使用するのが、DmlOptions.AssignmentRuleHeader クラス です。
このクラスには、割り当てルール適用を有効化するプロパティと特定の割り当てルールのみを適用させるプロパティの2種類があります。本記事では、両方のプロパティについて解説していきます。
割り当てルール適用を有効化する
Apexで作成したレコードに割り当てルールを適用する場合は、useDefaultRuleというプロパティを使用します。
公式ドキュメントではこのような説明が記載されています。
ケースまたはリードに true を指定した場合、システムはケースまたはリードのデフォルトの (有効な) 割り当てルールを使用します。
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_class_Database_AssignmentRuleHeader.htm#apex_class_Database_AssignmentRuleHeader
実際にコードを書いてみます。
Database.DMLOptions dmo = new Database.DMLOptions();
dmo.assignmentRuleHeader.useDefaultRule= true;
Case c = new Case(Status = '新規');
insert c;
useDefaultRule = true とすることで、Apex処理で作成したレコードに対しても割り当てルールが実行されます。
特定の割り当てルールのみを適用させる
もし、「すべての割り当てルールではなく、特定の割り当てルールのみを実行したい!」という場合は、assignmentRuleID を使用します。通常、ケースの割り当てルールは複数ルールを作成できても一つのルールしか有効化できません。しかし、この実装を使うことによって有効化されていないルールをApex上で有効化し実行することができます。
Database.DMLOptions dmo = new Database.DMLOptions();
dmo.assignmentRuleHeader.assignmentRuleId= '01QD0000000EqAn';
Case c = new Case(Status = '新規');
c.setOptions(dmo);
insert c;
書き方は、assignmentRuleIDに、割り当てルールのIDを指定し、insertするレコードに対してsetOptionsメソッドでオプションを設定します。
割り当てルールのIDは、割り当てルールの設定画面のURLから取得もしくは、開発者コンソールのQuery Editorで取得が可能です。
Query Editorで取得する場合は、以下が例となります。
ケースの割り当てルール
SELECT id, Name FROM AssignmentRule WHERE SobjectType = 'Case'
リードの割り当てルール
SELECT id, Name FROM AssignmentRule WHERE SobjectType = 'Lead'
Active = trueを検索条件とすることによって、有効化されている割り当てルールのみを取得できます。
まとめ
いかがでしたでしょうか?Apexでレコードを作成し、割り当てルールを適用させる場合は、今回紹介した実装を覚えておきましょう。
Salesforceの画面上では実現できないことも、Apexを活用することにより実現できることが多々あります。今後も、様々な裏技を紹介していけたらと思います。
今回参考にした公式ドキュメント
-DMLOptions クラス
https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_database_dmloptions.htm