トランザクションマネージャー:Salesforce 承認の統合
Salesforce の承認をトランザクションマネージャーに統合します。
Salesforce のセットアップ
- Postman:クイックスタート:Postman を Salesforce に接続する
- 承認のため送信: Salesforce 開発者:承認のためにレコードを送信
- 承認ステップ:レコードの一連のステップと承認者。たとえば、承認を得るために従業員のマネージャーに休暇申請を送信するなどです。
- アクション:承認された場合のレコードの更新や却下された場合の通知の送信など、承認結果に基づく自動化されたアクション。
これにより、承認プロセスが簡素化され、一貫性が確保されます。
- [設定] に移動し、[ 承認プロセス] をクリックして、トランザクション レコードを選択します。
- [ 承認プロセスの管理] で、[ 機会] を選択します。
- [ 新しい承認プロセスの作成] をクリックします。
- [ 承認のために送信および承認履歴を追加 ] オプションがオンになっていることを確認します。
該当する場合は、[エントリ固有の基準] セクションで条件を指定できます。
- [ 承認者を自動的にアサインする] を選択し、SysAdmin ロールを持つすべてのユーザーに設定します。
- [セットアップ] に移動し、[ オブジェクトマネージャー]、[ トランザクション] の順にクリックして、トランザクションレコードにカスタム選択リストフィールドを作成します。フィールドが複数選択の選択リストとして設定されていないことを確認します。
- 選択リストフィールドに 3 つの値を指定して、[承認待ち]、[承認済み]、および [却下] を区別します。
- カスタムフィールドをトランザクションレイアウトに追加します。
前の手順をスキップした場合は、次のようにフィールドをトランザクションレイアウトに追加できます。
- 承認プロセスに戻り、[ 最初の送信アクション]、[ 新しく追加]の順にクリックし、[ フィールドの更新]を選択します。必要な値で構成します。
- 承認プロセスの結果に基づいて関連するフィールドが更新されるようにするには、[承認アクション] セクションと [却下アクション] セクションでステップ 9 を繰り返します。次のスクリーンショットは、最終的な却下オプションを示しています。
フィールドの更新とともにメールアラートを含めた場合、承認プロセスは次のようになります。
最終承認プロセスにフィールドの更新のみがある場合は、次のようになります。
- [有効化] をクリックします。
- CORS に URL が含まれていることを確認するには、[セットアップ] 検索バーで CORS を検索するか、[セットアップ] に移動して [ セキュリティ]、[ CORS] の順にクリックします。これらが CORS に含まれていることを確認します。
トランザクションマネージャーのセットアップ:統合
トランザクションマネージャーを介して承認のためにレコードを送信するために使用される、イベントに対して 2 つの統合を作成します。
- Salesforce レコード ID を受け取る:UUID を使用して適切な Salesforce レコード ID をフェッチします。この統合は、上記の統合のカスタムフィールドに入力するために使用されます。
- 接続:Salesforce
- GET
追加パス:
/services/data/v62.0/query/?q=SELECT ID, CreatedDate, LGK__TransactionUUID__c FROM LGK__Transaction__c WHERE LGK__TransactionUUID__c = '{{http://txn.id/}}'ORDER BY CreatedDate DESC
応答変換:
{ "fields": [ { "variableName": "txn.custom.sfRecordID", "value": {{#each records}}{{#if @first}}"{{this.Id}}"{{/if}}{{/each}} }, { "variableName": "txn.custom.opportunityName", "value": {{#each records}}{{#if @first}}"{{this.LGK__OpportunityId__r.Name}}"{{/if}}{{/each}} }, { "variableName": "txn.custom.accountName", "value": {{#each records}}{{#if @first}}"{{this.LGK__AccountId__r.Name}}"{{/if}}{{/each}} } ] }更新されたクエリはこれを使用します:
/services/data/v62.0/query/?q=SELECT Id, CreatedDate,LGK__OpportunityId__c,LGK__OpportunityId__r.Name, LGK__AccountId__r.Name, LGK__AccountId__c,LGK__TransactionUUID__c FROM LGK__Transaction__c WHERE LGK__TransactionUUID__c ='{{txn.id}}'ORDER BY CreatedDate DESCcontextActorId Salesforce のシステムアドミンレコード ID を参照します。これは、[セットアップ] に移動して [ユーザー] をクリックし、ユーザーページの URL から ID をコピーすることで取得できます。
- 承認のため送信します。
- 接続:Salesforce
- POST
追加パス:
/services/data/v62.0/process/approvals
変換を要求:
{
"requests" : [{
"actionType": "Submit",
"contextId": "{{txn.custom.sfRecordID}}",
"nextApproverIds": [],
"comments":"The line item has a discount percentage of {{txn.custom.overallDealDiscount}}%",
"contextActorId": "005bm000003SKtJ", -- SF Record ID of user highlighted above
"processDefinitionNameOrId" : "TM_SF_Approval", --should be the unique name fro process definition detail highlighted above
"skipEntryCriteria": "true"}]
}
変換テンプレートの値が正しいことを確認してください。
トランザクションマネージャーのセットアップ:イベントの作成
Slack 承認統合は、ヘッドレスイベント API 呼び出しによって実装されます。このアプローチでは、レコードによってトリガーされるフローでこれらのヘッドレス API コールを使用し、Apex アクションを介してコールアウトを実行します。
前のステップで作成した 2 つの統合は、順番に機能するように設計されていることに注意してください。最初の統合で Salesforce レコード ID を受け取り、2 番目の統合で承認のために送信します。または、トランザクションを開くアクションで必要な構成を追加することで、Salesforce ID を受け取るプロセスを実行することもできます。
承認のためにステージを前方に進めるか、改訂のために後方に移動する 2 つの追加イベントを作成します。API コールアウト構成で使用するそれぞれの変数名を必ずメモしてください。
トランザクションマネージャーのセットアップ:レイアウトへの [承認のため送信] ボタンの追加
ボタンイベントは、次の JSON 形式を使用してdefault_draftレイアウトに追加できます。
{
"type": "button",
"event": "submitForApproval",
"label": "Revise",
"columnOrder": 2,
"variableName": "revise"
},
カスタムフィールドを ドラフトフィールドに追加してください:[] セクション;レイアウトに含める必要はありません。
{
"type": "ReadOnlyText",
"label": "SF Record ID",
"variableName": "txn.custom.sfRecordID"
},
レコードトリガーフロー
VS Code 環境を設定するには、次のドキュメントから VS Code 拡張機能をインストールします: セールスエンジニアリングチームメンバーのセットアップ
- Trailheads の承認プロセスに続いて、トランザクションの現在の承認ステータスを持つLGK__Transaction__Cオブジェクトに選択リストレコードを作成し、承認、却下、および承認待ちに基づいてプロセスがレコードを更新していることを確認します。
次の画像は、レコードトリガーフィールド (承認プロセスを作成したときに作成した Approval_Status__C フィールド) をトリガーするカスタムフィールドを示しています。
次の画像は、フローが完了したときの様子を示しています。
- [開始] ブロックで、[ 編集] をクリックします。
カスタムフィールドに基づいて LGK__Transaction__C オブジェクトでトリガーし、UUID が null でないことを確認します。また、[ 非同期で実行 ] と [ レコードが満たすように更新されたときのみ] をクリックしてください。
- ディシジョンブロックを追加し、作成したカスタムフィールドが承認または却下されたときの結果を作成します。
Apex コード
この Apex クラスは VS Code を介して展開されましたが、Salesforce にも展開できました。最初のステップは、マニフェストを使用して新しいプロジェクトを作成することです。
次に、Apex クラス (青色のボックス内) と manifest.xml ファイル (緑色のボックス内) を作成し、プロジェクトディレクトリ内のそれぞれのファイルに移動します。
Apex コード:
global with sharing class TransactionManagerFlow {
global class FlowInput {
@InvocableVariable(label='Triggering Record' required=true)
global LGK__Transaction__c triggeringRecord;
}
// Handle logic for Rejected status
@InvocableMethod(label='Logik.io Transaction callout from Salesforce' description='Makes callout to transition Logik.io transaction stage.')
global static void handleApprovalStatus(FlowInput[] requestInputs) {
System.debug('Handling Rejected status for Record: ' + requestInputs[0].triggeringRecord.Id);
LGK__ConfigurationTenant__c customSettings = LGK__ConfigurationTenant__c.getInstance();
String updatedRuntimeToken = '_gdyi0w0oGu1bNk3PO5exhUGqDFcZQVLIw';
System.debug(updatedRuntimeToken);
String endpoint = 'https://se-txn-sandbox.test02.logik.io';
for (FlowInput eachTxn : requestInputs) {
// Make the API request to transfer a transaction from 'new' stage to 'rejected' stage
// (compare with snippet from ApprovalProcessHandler.makeApiCall)
String uuid = eachTxn.triggeringRecord.LGK__TransactionUUID__c;
Http http = new Http();
HttpRequest request = new HttpRequest();
request.setHeader('Origin', endpoint);
if (eachTxn.triggeringRecord.Approval_Status__c == 'Rejected') {
request.setEndpoint(endpoint + '/api/t/' + String.valueOf(uuid) + '/events/revise'); // Example endpoint
System.debug('Endpoint set for rejection' + request.getEndpoint());
} else if (eachTxn.triggeringRecord.Approval_Status__c == 'Approved') {
request.setEndpoint(endpoint + '/api/t/' + String.valueOf(uuid) + '/events/proceedToApproved'); // Example endpoint
System.debug('Endpoint set for approval' + request.getEndpoint());
}
request.setMethod('POST');
request.setHeader('Authorization', 'Bearer ' + updatedRuntimeToken);
request.setHeader('Content-Type', 'application/json');
request.setBody('{}'); // Convert to JSON if inputs are needed
System.debug(request);
if (!Test.isRunningTest()) {
HttpResponse response = http.send(request);
if (response.getStatusCode() != 200) {
System.debug(LoggingLevel.ERROR, 'Error transitioning transaction: ' + response.getStatusCode());
System.debug(LoggingLevel.ERROR, response.getBody());
} else {
System.debug('Rejected API Call Failed: ' + response.getStatusCode() + ' - ' + response.getBody());
}
} else {
eachTxn.triggeringRecord.LGK__TransactionUUID__c = 'testUUID';
}
}
}
}
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>TransactionManagerFlow</members>
<name>ApexClass</name>
</types>
<version>61.0</version>
</Package>
次に、展開先の組織にログインしていない場合は、 sf org login web コマンドを使用してログインします。これにより、login.salesforce.com に移動します。
CLI を承認すると、結果は次のようになります。
SF config set target-org=<username>
ログインしたら、次のコマンドを実行します。
SF プロジェクト展開開始 --manifest manifest/package.xml
意思決定ブロックの後に Apex アクションを追加し、フローがスクリーンショットに示されているものと類似していることを確認します。(invocable メソッドの label パラメーターに一致する名前を探します)。
最後に、フローをアクティブ化してテストします。
テスト中
レコードによってトリガーされるフローとトランザクションマネージャーの詳細計画が作成された後、この SOQL クエリは Salesforce での承認プロセスのデバッグに役立つ場合があります。
Salesforce 承認ステータスの受信 (最新のプロセスのステータスの取得)
- 接続:Salesforce
- GET
- 追加パス:{_endpoint}/services/data/v61.0/query/?q=SELECT+Id,Status,TargetObjectId+FROM+ProcessInstance+WHERE+TargetObjectId={{sfRecordId}}+ORDER+BY+CreatedDate+DESC
- SOQL クエリ
SELECT Id, Status, TargetObjectId
FROM ProcessInstance
WHERE TargetObjectId-'006bm000002IUI4AAO' -- This is the sf oppy/transaction object id
ORDER BY CreatedDate DESC