【備忘録】
SalesforceでApexからレコードをロック解除する方法です。
まず、カスタムオブジェクトの中で承認プロセスが起動した際、
レコードがロックされ編集できなくなる事が問題でした。
いちいち管理者側でレコードロックを手動で解除するのは面倒だったので自動化。
##事前準備
まずは設定画面からクイック検索で「プロセスの自動化設定」より
「Apexでのレコードのロックおよびロック解除を有効化」にチェックを入れ、保存。
これをしないと上手く処理が回りません。
##Apexクラス
public class OpportunityApprovalUnlock{
@InvocableMethod(label='レコードロック解除')
public static void doUnlockByFuture(List<ID> appIds){
//Unlock操作
List<Opportunity__c> apps = [SELECT ID FROM Opportunity__c WHERE ManagerApproval__c!='承認済み' AND ApplyingForManager__c=true];
List<Approval.UnlockResult> unLockResults = Approval.unlock(apps, false);
}
}
プロセスビルダーからある一定条件を満たした場合に
承認プロセスが走り出す仕組みになっていますが
それと同時にこのApexも起動させることでロックが解除されます。
##テストクラス作成時注意点
現状Salesforceではレコードがロックされているかどうかを判断するメソッドが存在しないそうなので、テストではupdateを実行して例外が発生するかを見る方法が有効だそうです。
##リリース時注意点
上記コードをリリースする際、テスト環境でのコードカバー率は100%なのにリリースの検証時にコードカバー率エラーが発生し、リリースが出来ませんでした。
原因としては実質テストコードでコードカバー率を上げていたのではなく、プロセスビルダーで上記クラスのメソッドを呼んでいたからというもの。
プロセスビルダーから呼んだ場合でもコードカバー率が上昇してしまうとのことでした。
そもそもトリガーの中などに組み込めれば上記の事象は発生しないのですが
ミジンコスキルではこの方法での実装が限界だったという…(´-`) .。oO