トランザクションマネージャー:Salesforce 承認の統合

  • リリースバージョン: Australia
  • 更新日 2026年03月12日
  • 所要時間:16分
  • Salesforce の承認をトランザクションマネージャーに統合します。

    メニュー

    トランザクション

    Salesforce のセットアップ

    次の Salesforce Trailheads モジュールとドキュメントを参照してください。
    Salesforce の承認プロセスは、組織内のレコード承認ワークフローを自動化します。以下を定義します。
    • 承認ステップ:レコードの一連のステップと承認者。たとえば、承認を得るために従業員のマネージャーに休暇申請を送信するなどです。
    • アクション:承認された場合のレコードの更新や却下された場合の通知の送信など、承認結果に基づく自動化されたアクション。

    これにより、承認プロセスが簡素化され、一貫性が確保されます。

    ワークフロー

    1. [設定] に移動し、[ 承認プロセス] をクリックして、トランザクション レコードを選択します。
    2. [ 承認プロセスの管理] で、[ 機会] を選択します。
    3. [ 新しい承認プロセスの作成] をクリックします。

      新しい承認プロセスを作成

    4. [ 承認のために送信および承認履歴を追加 ] オプションがオンになっていることを確認します。

      該当する場合は、[エントリ固有の基準] セクションで条件を指定できます。

    5. [ 承認者を自動的にアサインする] を選択し、SysAdmin ロールを持つすべてのユーザーに設定します。

      承認者を自動的にアサインする

    6. [セットアップ] に移動し、[ オブジェクトマネージャー]、[ トランザクション] の順にクリックして、トランザクションレコードにカスタム選択リストフィールドを作成します。フィールドが複数選択の選択リストとして設定されていないことを確認します。

      トランザクション

    7. 選択リストフィールドに 3 つの値を指定して、[承認待ち]、[承認済み]、および [却下] を区別します。

      新しいカスタムフィールド

    8. カスタムフィールドをトランザクションレイアウトに追加します。

      レイアウト

      前の手順をスキップした場合は、次のようにフィールドをトランザクションレイアウトに追加できます。

      レイアウト

    9. 承認プロセスに戻り、[ 最初の送信アクション]、[ 新しく追加]の順にクリックし、[ フィールドの更新]を選択します。必要な値で構成します。
    10. 承認プロセスの結果に基づいて関連するフィールドが更新されるようにするには、[承認アクション] セクションと [却下アクション] セクションでステップ 9 を繰り返します。次のスクリーンショットは、最終的な却下オプションを示しています。

      トランザクション

      フィールドの更新とともにメールアラートを含めた場合、承認プロセスは次のようになります。

      承認プロセス

      最終承認プロセスにフィールドの更新のみがある場合は、次のようになります。

      承認プロセス

    11. [有効化] をクリックします。

      アクティブ化

    12. CORS に URL が含まれていることを確認するには、[セットアップ] 検索バーで CORS を検索するか、[セットアップ] に移動して [ セキュリティ]、[ CORS] の順にクリックします。これらが CORS に含まれていることを確認します。

      セキュリティ

    トランザクションマネージャーのセットアップ:統合

    トランザクションマネージャーを介して承認のためにレコードを送信するために使用される、イベントに対して 2 つの統合を作成します。

    注:
    Postman でこれらの呼び出しをテストする場合、エンドポイントは My Salesforce URL ( <https://logik-1e-dev-ed.develop.my.salesforce.com/>) です。
    1. 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 DESC

      contextActorId Salesforce のシステムアドミンレコード ID を参照します。これは、[セットアップ] に移動して [ユーザー] をクリックし、ユーザーページの URL から ID をコピーすることで取得できます。

      統合

    2. 承認のため送信します。
      • 接続: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 拡張機能をインストールします: セールスエンジニアリングチームメンバーのセットアップ

    1. Trailheads の承認プロセスに続いて、トランザクションの現在の承認ステータスを持つLGK__Transaction__Cオブジェクトに選択リストレコードを作成し、承認、却下、および承認待ちに基づいてプロセスがレコードを更新していることを確認します。

      次の画像は、レコードトリガーフィールド (承認プロセスを作成したときに作成した Approval_Status__C フィールド) をトリガーするカスタムフィールドを示しています。

      承認プロセス

      次の画像は、フローが完了したときの様子を示しています。

      ワークフロー

    2. [開始] ブロックで、[ 編集] をクリックします。

      カスタムフィールドに基づいて LGK__Transaction__C オブジェクトでトリガーし、UUID が null でないことを確認します。また、[ 非同期で実行 ] と [ レコードが満たすように更新されたときのみ] をクリックしてください。

      トリガーを構成

    3. ディシジョンブロックを追加し、作成したカスタムフィールドが承認または却下されたときの結果を作成します。

      ディシジョンブロック

    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 を承認すると、結果は次のようになります。

    スクリプト

    注:
    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