代理承認者の設定範囲の制御
できること
mitocoの代理承認者設定で自分以外のユーザの代理承認者を設定する際に、「だれがどのユーザの設定までを変更可能か」という制御がApexクラスを作成することにより可能となります。
設定方法
作成したApexクラスの設定方法
- Salesforceの[設定]から[クイック検索]に「カスタム設定」と入力し[カスタム設定]を選択します。
- 表示ラベルが[ワークフロー設定]となっている行の[Manage]をクリックします。
- [デフォルトの組織レベルの値]の上にある[新規]または[編集]ボタンをクリックします。
[代理承認者フィルタークラス名]に設定範囲を制御するApexのクラス名を入力して[保存]ボタンをクリックします。
名前空間が設定されている組織の場合はApexのクラス名の前に名前空間も付与してください。
作成するApexクラスについては下記を参照してください。
代理承認者の設定可能範囲を判定するApexクラスを作成
Apex実装例を参考に、WF_DelegatedApproverFillterインタフェースを継承したApexクラスを作成してください。
前提条件
作成するクラスは、以下の条件を満たしている必要があります。この条件を満たしていない場合、ワークフローは動作を保証しません。
- WF_DelegatedApproverFillter インタフェースを実装していること。
- WF_DelegatedApproverFillter インタフェースの実装ルールに基づいていること。
- global であること。
WF_DelegatedApproverFillter インタフェースの詳細
名前空間
TSMNTWF
run メソッド
ログインユーザが、画面上で選択したユーザに対して代理承認者を設定可能か判断を行います。このメソッドの実装は以下の条件を満たす必要があります。
- チェック処理が完了し、代理承認者の設定が許可できると判断した場合はtrueを返すこと。
- チェック処理が完了し、代理承認者の設定が許可できないと判断した場合はfalseを返すこと。
※ システム管理者相当のユーザであっても設定したApexのチェックロジックが実行されます。
システム管理者相当のユーザであれば自由に他者の代理承認者設定を変更できるようにするには、
実装例を参考にシステム管理者相当のユーザを許可するチェックロジックを記載してください。
※ ワークフローは、戻り値の妥当性、整合性は検証しません。フィルター処理の妥当性、整合性はメソッド内で検証してください。
※ 何らかの理由により処理を中止する場合は例外をスローしてください。ワークフローは処理を中止し、画面には例外に設定した メッセージを表示します。
※ SOQLのコール回数等のガバナ制限の影響を受けることに留意してください。SOQLのコール回数が極端に多い場合等は、ワークフローは動作を保証しません。
シグニチャ
Boolean run(Map<String, Object> values)
パラメータ
values
型: Map<String, Object>
values は run 実行時の状態を保持しています。以下のキーが保持されています。代理承認者の設定可能チェックを実行する際に、必要な情報を利用してください。
キー | 値 | 型 |
---|---|---|
userId | 操作者のユーザID | Id |
targetUserId | 代理承認者を設定しようとする対象ユーザID | Id |
戻り値
型: Boolean
代理承認者の設定可能チェックの結果を示す正負値です。
- True:チェックOK。このユーザに代理承認者を設定できる
- False:チェックNG。このユーザに代理承認者を設定できない
Apex実装例
global with sharing class DelegatedApproverFillter implements TSMNTWF.WF_DelegatedApproverFillter { public Boolean run(Map<String, Object> values) { // 引数からユーザ情報を取得 Id userId = (Id) values.get('userId'); Id targetUserId = (Id) values.get('targetUserId'); List<Id> userIds = new List<Id>{userId, targetUserId}; /* //Ver6.2以前の代理承認者設定の仕様にて、他承認者への代理承認者設定が可能なユーザを通す //(ログインユーザにシステム管理者相当の権限があればOKとするチェック) List<PermissionSetAssignment> assignmentList = [ SELECT Id, PermissionSet.PermissionsManageUsers, PermissionSet.PermissionsManageInternalUsers FROM PermissionSetAssignment WHERE AssigneeId = :userId AND (PermissionSet.PermissionsManageUsers = true OR PermissionSet.PermissionsManageInternalUsers = true) ]; if(!assignmentList.isEmpty()) { return true; } */ // 自分を選択していた場合はOKとする if (userId == targetUserId) { return true; } List<User> userDataList = [ SELECT Id, Name, Department FROM User WHERE Id in :userIds ]; // 操作ユーザと同じ部署であれば、代理承認者を設定してOK if(userDataList[0].Department == userDataList[1].Department) { return true; } return false; } }