Contents
よくあるニーズ
・未承認申請を一覧表示して、誰の承認のところで止まっているか確認したい
・承認申請をするユーザの視点で、自分の過去の申請のステータスを一覧で確認できるようにしたい
・承認済の申請も含めて、過去の承認申請を一覧表示したい
問題の背景
・アプリケーションランチャからApproval Requestsタブを選択して表示されるのはItems to Approve(=自分自身に割り当てられた未承認申請の一覧)だけである。
・この問題は「Salesforce Lightning: List-views Approval Requests」という表題でIdeaExchangeに以前から起票されている。
・Classic時代は「管理レポート(Administrative Reports)」内に「未承認申請一覧(All Pending Approval Requests)」レポートが標準で存在した上、「承認プロセスインスタンス(Approval Process Instances)」の標準レポートタイプを用いてレポートを作成することもできた。
可能な解決策の一覧
解決策1:Process Instanceのカスタムレポートタイプを作成し、レポート表示する
解決策2:「Enhanced Approval Requests Pro(※AppExchange)」を利用する
解決策3:承認申請の対象オブジェクト側に「承認状況」カスタム項目を持たせ、そのレコードをリストビュー・レポートなど一覧表示する
解決策4:画面フローで承認履歴を取得して表示する
解決策5:LWC or VFで承認履歴一覧を表示する
結論(=どうすべきか)
解決策3→解決策1→その他 の順に検討することが望ましい。
基本的に承認申請を組む場合は「承認状況」カスタム項目の値を適宜「項目自動更新」で更新する実装を行う(必要であれば、「承認申請日」などの日付項目も持たせる)のがベストプラクティスである。
この実装手法は、承認プロセスに関するTrailheadである「割引承認プロセスの作成」においても暗黙に紹介されている。
解決策3(「承認状況」カスタム項目をベースとしたリストビュー)を解決策1(「プロセスインスタンス」カスタムレポート)に対して優先すべき理由は主に以下の二点である。
①プロセスインスタンスの「アクセス権制御ができない」という特殊性に起因したセキュリティ事故のリスクを軽減できる
②承認状況の更新をトリガとしたロジックが組みやすくなる
二点とも次節に詳述する「プロセスインスタンス(Process Instance)」オブジェクト特有の特殊な仕様に由来している。
「プロセスインスタンス(Process Instance)」の特殊性
「プロセスインスタンス(Process Instance)」に関連した諸オブジェクト、すなわちProcessInstance・ProcessInstanceHistory・ProcessInstanceNode・ProcessInstanceStep・ProcessInstanceWorkitemは共有して以下の性質を持つ。
①アクセス権制御ができない(=内部的にShareオブジェクトが存在しない)
②フローやApexTriggerの起点として指定できない
◼️アクセス権制御ができない
プロセスインスタンスにはSalesforceの通常のアクセス権制御が適用されない。
内部構造的な観点で言うと、(「商品(Product2)」オブジェクトと同様に)いわゆるShareオブジェクトが存在しない。
ではどのようなアクセス権制御の仕組みになっているかだが、プロセスインタンスにはいかなるアクセス権制御も適用されない。
換言すれば、内部ユーザである限り(フィルタをかけていない)Process Instanceレポートにアクセスすれば過去現在に渡る全ユーザの承認申請履歴を閲覧可能である。
SFを使い慣れているユーザであれば、「承認申請の参照先レコード(=申請の対象となっているレコード)にアクセス権を有しているか」や「承認申請の割り当て先になっているか」に応じてアクセス権が連動することを期待するところだが、残念ながらそのような仕様とはなっていない。
実のところ、これこそがSalesforce社が「承認申請タブを押した際に、未承認申請しか閲覧できないよう、リストビューに制限をかけている」理由である。
この問題の回避策としては以下を挙げることができる。
①ユーザ別フィルタをかけていない「プロセスインスタンス」レポートについては、管理者のみが閲覧可能なフォルダに格納し、一般のユーザがアクセスできないようにする
②申請ユーザなど、一般ユーザにレポートへのアクセス権を与える場合、以下を実施する。
・レポートの配布前に、申請ユーザ=$USERのフィルタをロックしておく
・(プロセスインタンスに関するレポートを自身で作成できないように)レポートの作成権限を剥奪しておく
◼️フローやApexTriggerの起点として指定できない
文字通り、プロセスインスタンスに関連した諸オブジェクトはフローやApexTriggerのトリガイベントになることができない。
取得することは可能であるため、例えば「申請中の承認申請が7日間、承認も却下もされずに放置されている場合は自動通知する」などのロジックを組む場合、ProcessInstanceWorkItemに関するスケジュールフローを作成することになる。
承認申請・承認履歴の可視化のベストプラクティス
・原則的に、承認状況は承認申請の対象オブジェクトに属性情報として持たせ、エンドユーザはそこから自身の申請状況を確認できるようにする。
・「プロセスインタンス(Process Instance)」に関するカスタムレポートタイプ・カスタムレポートの作成には高いセキュリティリスクが存在する。このセキュリティリスクは、ユーザが新規レポート作成権限を有する限り、「プロセスインスタンス」レポートへのアクセス権限を(フォルダの共有権限で)制限するなどしても軽減されることがない。