【Salesforce】Integration Procedureについて

# Integration Procedure
1回のサーバーコールで、複数のアクションを実行できます。
また、Salesforceだけでなく、外部のデータソースからも情報を取得できます。
さらに、ガバナ制限への対策など、処理能力を高めるための仕組みも提供しています。

## Integration Procedure Designer
Integration Procedureをドラッグアンドドロップにより実装し、プレビュー機能を備えた開発ツールです。
下記の4要素から構成されています。

+ **［AVAILABLE CONPONENTS］パネル**<br>[Group］要素と［Action］要素が表示されます。

+ **［STRUCTURE］パネル**<br>［AVAILABLE CONPONENTS］パネルから［STRUCTURE］パネルに要素をドラッグアンドドロップします。

+ **［PROPERTIES］ペイン**<br>要素ごとに［PROPERTIES］ペインがあり、各要素のJSONを編集するためのリンクが設定されています。

+ **［PREVIEW］ペイン**<br>［PREVIEW］ペインでは、パラメータを入力してIntegration Procedureを実行し、正しく実行されているかどうかを確認できます。トラブルシューティングする場合は、［Errors/Debug Output］を使用します。

## Integration Procedureの要素

### Groups
+ **Cache Block**
このBlock内のステップの出力をセッションまたは組織のキャッシュに保存して、すばやく取得できるようにします。
アクセス頻度は高いが、更新頻度の低い情報を保存することにより、データベースへのラウンドトリップが減少し、パフォーマンスが向上します。
有効期限の設定や、キャッシュ無しの更新もできます。

+ **Conditional Block**
指定した条件がtrueの場合に、Blockを実行します。
または、Block内のステップを相互に排他的な一連のステップとして扱えます。
分岐ワークフローもサポートしています。

+ **Loop Block**
データ配列の項目を反復処理し、項目ごとにこのBlock内のActionが繰り返されるようにします。
Loop Blockの配列は、各反復が配列内の1つの項目のみを受け取るように処理されます。

+ **Try-Catch Block**
Block内でステップの実行を「試行」し、ステップが終了した時にエラーを「検出」します。
Block内のステップが失敗した場合は、指定した出力を返すか、Apexクラスをコールします。

### Action
Actionは、大きく分けて下記のように分類できます。
+ OmniStudioの他の機能を呼び出す

| アクション名 | 説明 |
|-|-|
| DataRaptor Extract Action | DataRaptor Extractを呼び出し、複数のSalesforceオブジェクトからデータを取得します。 |
| DataRaptor Turbo Action | DataRaptor Turbo Extractを呼び出し、１つのSalesforceオブジェクトからデータを取得します。 |
| DataRaptor Post Action | DataRaptor Loadを呼び出し、Salesforceにデータを保存します。 |
| DataRaptor Transform Action | DataRaptor Transformを呼び出し、フォーマットを変換します。 |
| Integration Procedure Action | 付随するIntegration Procedureを実行します。 |
| Calculation Action | Calculation Procedureを呼び出し、演算処理を実行します。 |
| Matrix Action | 入力された値をもとにデシジョンマトリックスを呼び出し、その結果をntegration Procedureに返します。 |

+ アクションによりデータを取得する

| アクション名 | 説明 |
|-|-|
| Remote Action | 指定されたApexクラスやメソッド、Invocable Actionを呼び出します。 |
| HTTP Action | RESTコールを実行し、その結果をIntegration Procedureに返します。 |

+ 直接処理を実行する

| アクション名 | 説明 |
|-|-|
| Batch Action | スケジュール済みジョブを実行します。 |
| Chatter Action | Chatterポストを作成し、Chatterフィードに送信します。 |
| Delete Action | １つ、または複数のSalesforceオブジェクトを削除します。 |
| DocuSign Envelope Action | 署名用のドキュメントセットをメールで送信します。 |
| Email Action | メールを送信します。 |
| List Action | 指定されたリストアイテムのJSONノードの値を照合して、複数のリストをマージします。 |
| Response Action | Integration Procedureを終了し、呼び出したエンティティにデータを返します。 |
| Set Values | Integration ProcedureのデータJSON内の値を、マージフィールドや数式を使って設定します。 |

### プロパティ
Integration Procedureには、OmniStudioのその他の機能を呼び出すためのプロパティやアクションプロパティなど様々なプロパティがあります。
中でも、特に重要なプロパティとして下記が挙げられます。

| アクション名 | 説明 |
|-|-|
| Send JSON Path | 入力したJSONをパスでトリミングします。 |
| Send JSON Node | 指定したノードの下に、入力したJSONを再ペアリングします。 |
| Response JSON Path | 出力されたJSONをパスでトリミングします。 |
| Response JSON Node | 指定したノードの下に、出力されたJSONを再ペアリングします。 |
| Send Only Additional Input | チェックした場合は、Additional Inputプロパティのデータのみを送信します。 |
| Additional Input | 入力データのJSONに含まれる追加のキー/値のペア。<br>値（fx）には、数式やマージ構文を含めることができます。 |
| Return Only Additional Output | チェックした場合は、Additional Outputプロパティのデータのみを受け取ります。 |
| Additional Output | 出力データのJSONから返される追加のキー/値のペア。<br>値（fx）には、数式やマージ構文を含めることができます。 |
| Return Only Failure Response | チェックした場合は、アクションが失敗した場合には、Failure Responseのみを返します。 |
| Failuer Response | アクションが失敗した場合に、出力データのJSONで返されるキー/値のペア。<br>値（fx）には、数式やマージ構文を含めることができます。 |
| Fail On Step Error | Trueに設定すると、ステップが失敗した場合はIntegration Procedureが終了します。 |
| Chain On Step | アクションを独自のSalesforceトランザクションで実行できるようにします。<br>パフォーマンスが低下する可能性がありますが、ガバナ制限に対策できます。 |
| Execution Conditional Formula | ステップを実行するどうか決める数式になります。<br>数式の結果がTrueもしくは数式が無ければ、ステップを実行します。<br>数式の結果がFalseであれば、ステップを実行しません。 |

※マージ構文は、下記のように記載します。
````````
%ContextID%
````````

※パスを区切る時は、下記のようにコロンを用いて記載します。
````````
PathA：PathB
````````

## データの受け渡し
### インプット
+ **Salesforceオブジェクトからの高度なインプット**
Salesforce → DataRaptor Extract Action → Integration Procedure

+ **Salesforceオブジェクトからのインプット**
Salesforce → DataRaptor Turbo Action → Integration Procedure

+ **APIからのインプット**
API　→ HTTP Action → Integration Procedure

+ **Apexを利用したインプット**
Apexで接続可能なデータソース → Apex Class → Remote Action → Integration Procedure

※Integration Procedureは、1コールで複数のアクションを実行できます。 
DataRaptor Turbo Extract自体は1つのsObjectからしか情報を取得できませんが、Integration Procedureにより複数のDataRaptor Turbo Actionにより複数のsObjetから情報を取得できます。
ただし、DataRaptor Turbo Extractは、数式や複雑な出力の対応付けなどをサポートしていません。
そのため、高度な設定を必要とする場合はDataRaptor Extract Actionを実行します。

### アウトプット
+ **Integration Procedureのみでのアウトプット**
Integration Procedure → Response Action → Integration Procedureが呼び出す要素

+ **Salesforceへのアウトプット（UpInsert）**
Integration Procedure → DataRaptor Post Action → Salesforce

+ **Salesforceへのアウトプット（削除）**
Integration Procedure → Delete Action → Salesforce

+ **APIへのアウトプット**
Integration Procedure → HTTP Action → API

+ **メールでのアウトプット**
Integration Procedure → Email Action → メール

+ **DocuSignを利用したアウトプット**
Integration Procedure → DocuSign Envelope Action → DocuSign Template → For Signature → メール

※DocuSign Template以降は、DocuSignで行います。

## チェーニング
Integration Procedureは、デフォルトではすべてのアクションを同じトランザクションで実行します。
チェーニングを有効化し、特定のトランザクション制限に達したら、以降のジョブを次のトランザクションで実行することで、ガバナ制限を回避することができます。
チェーニングには、下記の3種類があります。

+ **Chainable**
チェーニングが有効であり、ステップがトランザクションの制限を超えた場合、中間結果が保存され、ステップは新しいトランザクションで継続されます。
トランザクションの制限を超えなければ、すべてのステップは同一のトランザクションで実行されます。

+ **Queueable Chainable**
チェーン可能なステップが非同期Apexとして実行されるキュー可能ジョブを開始できるようにして、ガバナ制限を増やすことができます。
Queueable Chainbale設定で、Chainable設定がオーバーライドされます。（両方とも設定している場合）

+ **Chain On Step**
OmniScriptにて［Chain On Step］が有効なIntegration Procedureをコールすると、アクションの次のステップは常に新しいトランザクションで実行されるようになります。

## その他
+ 処理時間が長い処理が含まれる場合は、Chainingを使います。

+ 複数のオブジェクトから大量のデータを取得する必要がある場合は、複数のDataRaptor Turbo ExtractをIntegration Procedureで組み合わせます。

+ ユーザーインターフェースをデータソースへの変更と切り分けたい場合にも、Integration Procedureを使うことができます。

+ Integration Procedureの［Debug Log］に表示されるJSONは、DataRaptorを作成する時に［Input JSON］の元データとして利用できます。<br>参照：[条件付き DataRaptor Load を使用して Integration Procedure を構築する](https://developer.salesforce.com/files/OmniStudio/pdf/ja-jp/OmniStudio_Build_an_Integration_Procedure_with_Conditional_DataRaptor_Loads.pdf)

## 関連するTrailhead
[OmniStudio Integration Procedure](https://trailhead.salesforce.com/ja/content/learn/modules/omnistudio-integration-procedures)