LoginSignup
4
5

More than 5 years have passed since last update.

Salesforceで自動再割り当て機能を実装してみた話

Last updated at Posted at 2016-04-13

経緯

Salesforceには承認プロセスというものがあり、あらかじめ承認フローを決めておくことで承認業務を手軽に行うことができます。
ただ、何かの都合で承認申請をチェックすることができなかったりするとそこで止まってしまうことが度々あります。
Salesforce標準の機能で代理承認者や手動での再割り当てには以下のような特徴があります。

機能名 メリット デメリット
代理承認者 正式な承認者以外にもう一人承認が行える ホーム画面に未承認申請として出てこない
手動での再割り当て 任意のタイミングで再割り当て先を選んで割り当てができる 手動なので忘れるといつまでもそのまま

承認申請を確認しきれていないことで溜まってしまうことを解消したかったので、今回は自動で再割り当てを行う機能を作ってみることにしました。

未承認申請はどこにある?

そもそもSalesforceの中で「未承認申請」はどうやって管理しているのか分からなかったので探してみると、公式リファレンスの中に以下の記述がありました。

ProcessInstanceWorkitem

ユーザの保留中の承認申請を表します。

どうやらこれが「未承認申請」のようなので、このオブジェクトの中で割り当て先を管理しているようです。

公式リファレンスを見ると、ProcessInstanceWorkItemオブジェクトの中には以下の項目が設定されています。

項目名 内容
ActorId 現在承認申請が割り当てられているユーザのID
ElapsedTimeInDays 承認申請が割り当てられてから経過した時間(日単位)
ElapsedTimeInHours 承認申請が割り当てられてから経過した時間(時間単位)
ElapsedTimeInMinutes 承認申請が割り当てられてから経過した時間(分単位)

今回は時間単位でチェックするので、「ActorId」と「ElapsedTimeInHours」項目を使用しました。

実際に作ってみる

未承認申請を表すオブジェクトが見つかったところで、実装に取り掛かりました。
今回作ったものは以下のような機能のプログラムです。

  1. 1時間に1回、未承認申請をチェックする
  2. 申請から5時間以上経過した未承認申請を別の人に割り当てる

処理の大まかな流れは以下のようになっています。

  1. 特定の承認プロセスの未承認申請(ProcessInstanceWorkItem)をSOQLで取得する
  2. 取得したレコードの経過時間をチェックする
  3. 経過時間が5時間以上の未承認申請の承認者(ActorId)を承認者のマネージャに変更する

実際に書いたものは下記のようになりました。

AutoReAllocateSample.cls
public class AutoReAllocateSample implements Schedulable{
    global void execute(SchedulableContext SC){
        // 変更対象の未承認申請を取得
        List<ProcessInstanceWorkitem> updList = [SELECT Id, 
                                                        ActorId 
                                                   FROM ProcessInstanceWorkitem 
                                                  WHERE ProcessInstance.ProcessDefinition.DeveloperName = 'SampleProcess'
                                                    AND ElapsedTimeInHours >= 5];
        // 承認者情報の検索・取得用
        Set<Id> ids = new Set<Id>();
        for(ProcessInstanceWorkitem p : updList){
            ids.add(p.ActorId);
        }

        // 承認者とマネージャ
        Map<Id, Id> tIdMap = new Map<Id, Id>();
        for(User u : [SELECT Id, ManagerId FROM User WHERE Id = :ids]){
            tIdMap.put(Id, ManagerId);
        }

        // 承認申請再割り当て
        for(ProcessInstanceWorkitem p : updList){
            p.ActorId = tIdMap.get(p.ActorId);
        }

        update updList;
    }
}

これで再割り当てを行うプログラムができました。
あとはこれをスケジュール実行すれば定期的にチェックして再割り当てを行ってくれます。

scheduleSample.cls
AutoReAllocateSample a = new AutoReAllocateSample();
String sch = '0 0 * * * ?';
String jobID = system.schedule('自動再割り当てサンプル', sch, a);

これで未承認申請がたくさんたまってしまうことを避けられるかもしれません。

参考資料

今回の機能を実装するにあたり以下を参考にしました。
Salesforce および Force.com のオブジェクトリファレンス

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5