End-to-End事例:プリンター消耗品の自動補給

Salesforceのプラットフォームイベントの事例です。
原文:https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_example_printervendor.htm#platform_events_example_printervendor

いまひとつ具体的な例題をイメージできなかったので、探していました。
ちゃんとPlatform Events Developer Guideにあるじゃないですか（~~英文だけど...~~ winter21版が英文名だけで以前のバージョンは日本語がありました。）

この例は、プロセスとフローの2つのプラットフォームイベントを使用して、オフィスのプリンターに常に十分な用紙とインクがあることを確認する方法を示しています。
あなたの会社は「スマート」プリンターの出荷を受け取りました。 1日に1回Salesforceに情報を送信するようにプリンタを設定します。その情報を使用して、プリンタを表すSalesforceの資産レコードを更新してから、ベンダーにインクまたは紙を追加注文するかどうかを決定します。ベンダーに消耗品を注文するときは、技術者が新しい消耗品を配達した翌日に設置するようにスケジュールします。

#プラットフォームイベント:Printer Status と Vendor Response
この例では、2つのプラットフォームイベントを使用します。1つはプリンターからの情報を保持するため（Printer Status）、もう1つはベンダーからの情報を保持するため（Vendor Response）です。


Printer Statusプラットフォームイベントには、これらのカスタムフィールドが含まれています。

|API 名      |項目名        |型           |説明          |
|:-----------|:------------|:------------|:-------------|
|Serial_Numbe|Serial Number|Text	 |プリンタの一意の識別子。この値は、対応する資産レコードを見つけるために使用されます。|
|Ink_Status  |Ink Status   |Text         |値: Full, Medium, Low, or Empty|
|Paper_Level |Paper Level  |Number       |紙のレベル（パーセンテージ）|
|Total_Print_Count|Total Print Count|Number|印刷されたページの総数|

Vendor Responseプラットフォームイベントには、これらのカスタムフィールドが含まれています。

|API 名      |項目名        |型           |説明             |
|:-----------|:------------|:------------|:----------------|
|Order_Number|Order Number|Text          |注文の一意の識別子|
|Expected_Delivery_Date|Expected Delivery Date|Date|ベンダーが注文の配達を予定している日付|
|Order_Status|Order Status|Text          |値: Ordered, Confirmed, Shipped, Delivered, Delayed, Canceled.|

#プロセス：プリンターステータスイベントの自動化

SalesforceではPrinterStatusイベントを受信すると、プロセスはプリンタに関連付けられている資産レコードを見つけます。次に、イベントに一致するように合計印刷数を更新します。このプロセスでは、プリンタのインクまたは用紙が少ないかどうかを評価し、少ない場合はフローを開始します。

プラットフォームイベントメッセージを受信すると、プロセスが開始されます。このプロセスには、3つの基準とアクショングループがあります。


![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fprocess%2Fimages%2Fpb_events_example.png&folder=platform_events)

**Trigger**
プロセスのトリガーは、プリンターステータスイベントを受け取ります。シリアル番号を使用して、プリンターに一致する資産レコードを検索します。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fprocess%2Fimages%2Fpb_trigger_event.png&folder=platform_events)

**Criteria 1**
![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=dev_guides%2Fplatform_events%2Fimages%2Fpb_events_example_c1.png&folder=platform_events)

最初の基準は「基準なし」に設定されています。アクションを実行するだけです。常に発火するように。

アクショングループには、イベントの値と一致するようにアセットレコードの合計印刷数を更新する1つの即時アクションが含まれています。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=dev_guides%2Fplatform_events%2Fimages%2Fpb_events_example_c1_action.png&folder=platform_events)

最初の基準のアクションが実行された後、プロセスは次の基準を評価します。

**Criteria 2**
![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=dev_guides%2Fplatform_events%2Fimages%2Fpb_events_example_c2.png&folder=platform_events)


2番目の基準は、イベントのインクレベル値が低に設定されているかどうかを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6aafef5f-cc89-3a71-e8ac-575eff3ba09c.png)

2番目の基準のアクショングループには、フローを開始する1つの即時アクションが含まれています。アクションは、選択したフィールドをアセットから起動されたフローに渡します。

|FlowVariable|Type|Value|
|:-----------|:---|:----|
|assetId|Reference|[Asset].Id|
|assetOwner|Reference|[Asset].OwnerId|
|inkManufacturer|Reference|[Asset].Ink_Manufacturer__c|
|inkNeeded|Boolean|True|
|inkType|Reference|[Asset].Ink_Type__c|
|paperNeeded|Boolean|False|
|paperSize|Reference|[Asset].Paper_Size__c|
|serialNumber|Reference|[Asset].SerialNumber|

2番目の基準のアクションが実行された後、プロセスは次の基準を評価します。

**Criteria 3**

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=dev_guides%2Fplatform_events%2Fimages%2Fpb_events_example_c3.png&folder=platform_events)


3番目の基準は、イベントの用紙レベルの値が10未満であるかどうかを確認します。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=dev_guides%2Fplatform_events%2Fimages%2Fpb_events_example_c3_conditions.png&folder=platform_events)

3番目の基準のアクショングループには、同じフローを開始する1つの即時アクションが含まれています。アクションは、選択したフィールドをアセットから起動されたフローに渡します。低インク基準グループが行ったのと同じ値のほとんどをフローに渡しますが、inkNeededがfalseに設定され、paperNeededがtrueに設定されています。

|FlowVariable|Type|Value|
|:-----------|:---|:----|
|assetId|Reference|[Asset].Id|
|assetOwner|Reference|[Asset].OwnerId|
|inkManufacturer|Reference|[Asset].Ink_Manufacturer__c|
|inkNeeded|Boolean|False|
|inkType|Reference|[Asset].Ink_Type__c|
|paperNeeded|Boolean|True|
|paperSize|Reference|[Asset].Paper_Size__c|
|serialNumber|Reference|[Asset].SerialNumber|

プロセスには3つの基準しかないため、3番目の基準のアクションが実行された後、プロセスは停止します。

#フロー：ベンダー応答イベントの自動化

プリンタサプライの注文フローは、インクと紙のどちらを注文するかを決定することから始まります。決定に基づいて、Apexアクションを使用して、ベンダーにインクまたは紙の注文を送信します。次に、ベンダーが注文が発送されたことを示すプラットフォームイベントメッセージを送信するまで一時停止します。 Salesforceが指定されたイベントを受信すると、フローが再開され、アセットの所有者が新しいサプライ品をインストールするためのタスクが作成されます。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_full.png&folder=platform_events)

**決定要素 **
この決定には、インクと紙の2つの結果が含まれます。変数{！inkNeeded}がtrueの場合、インクの結果はtrueです。変数{！paperNeeded}がtrueの場合、Paperの結果はtrueです。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_outcomeink.png&folder=platform_events)

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_outcomepaper.png&folder=platform_events)

**Apex Action Elements**

フローには、ベンダーに供給注文を送信するが、フローがインクの結果を実行したか紙の結果を実行したかに基づいて異なる情報を提供する2つのApexアクションが含まれています。入力値に使用されるすべての変数（{！serialNumber}や{！paperSize}など）は、プロセスがフローを起動するときに設定されます。

最初のApexアクションは、注文するインクに関する情報を提供します。


![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_apexink.png&folder=platform_events)


2番目のApexアクションは、注文する用紙に関する情報を提供します。
![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_apexpaper.png&folder=platform_events)

両方のApexアクションで、アクションは注文番号を返します。フローは、その値を{！orderNumber}変数に格納して、Pause要素で参照します。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_apexoutput.png&folder=platform_events)


**Pause要素**

Apexアクションが供給注文を送信した後、フローは注文が出荷されたことの確認を待ちます。その確認は、ベンダー応答プラットフォームイベントを通じて受信されます。

フローは、Salesforceが特定の値を持つベンダーリクエストイベントメッセージを受信するまで一時停止します。注文番号は、Apexアクションが提供した注文番号と同じである必要があります。また、注文ステータスは出荷済みである必要があります。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_waitinput.png&folder=platform_events)

正しいイベントメッセージが受信されてフローが再開されると、フローはイベントメッセージのデータをレコード変数に格納します。これにより、配達予定日を参照して、消耗品の設置予定日を計算できます。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_waitoutput.png&folder=platform_events)

**レコード要素の作成**

フローが再開すると、資産所有者が新しい消耗品をインストールするためのタスクが作成されます。

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_taska.png&folder=platform_events)

タスクのフィールド値の場合、フローはこれらのリソースを使用します。

+ {！installDate}-イベントの配信予定日の翌日を計算する式。
+ {！taskDescription}-インストールの詳細を示すテキストテンプレート。
+ {！assetOwner}-フローを起動するプロセスによって提供されます
+ {！assetId}-フローを起動するプロセスによって提供されます

![image.png](https://developer.salesforce.com/docs/resources/img/en-us/228.0?doc_id=help%2Fflow%2Fimages%2Fflow_event_task.png&folder=platform_events)