プラットフォームイベントの活用事例

# **Salesforceにおけるプラットフォームイベントの活用事例と実装方法**  

## **1. プラットフォームイベントとは？**  
Salesforceの「プラットフォームイベント」は、非同期でのデータ処理を実現する仕組みです。  
従来のワークフローやプロセスビルダーでは難しい「リアルタイムなイベント駆動型処理」を可能にします。

🔹 **主な用途**  
- **システム間の連携**（Salesforceと外部システムのリアルタイム連携）  
- **複数の処理を非同期で実行**（例：商談成立後に請求書作成とメール送信を並行処理）  
- **バッチ処理の代替**（大量データの更新通知）  

---

## **2. 活用事例①：商談成立後に請求書を自動作成 & メール通知**
### **📌 要件**
- 商談（Opportunity）が`成約（Closed Won）`になったら、請求書（Invoice）を作成する  
- その後、請求書作成の通知メールを営業担当者に送る  

### **📌 実装の流れ**
1. **プラットフォームイベントを作成**（InvoiceEvent）  
2. **Apexトリガーでイベントを発行**（商談が成約したら発行）  
3. **イベントを購読して請求書を作成**（Apex または フローで購読）  
4. **請求書作成後に通知メールを送信**

---

### **3. 実装**
#### **① プラットフォームイベントの作成**
**設定 → プラットフォームイベント** から、新しいイベント `InvoiceEvent` を作成し、  
以下のフィールドを定義します。  

| フィールド名 | API名 | データ型 |
|-------------|-------------|--------|
| 商談ID | OpportunityId__c | Lookup (Opportunity) |
| 金額 | Amount__c | Currency |
| 請求先メール | Email__c | Email |

---

#### **② Apexトリガーでイベントを発行**
`商談のステージがClosed Wonになったら、InvoiceEventを発行する`  

```apex
trigger OpportunityTrigger on Opportunity (after update) {
    List<InvoiceEvent__e> events = new List<InvoiceEvent__e>();

    for (Opportunity opp : Trigger.new) {
        Opportunity oldOpp = Trigger.oldMap.get(opp.Id);

        // ステージが"Closed Won"に変更された場合、イベントを発行
        if (opp.StageName == 'Closed Won' && oldOpp.StageName != 'Closed Won') {
            InvoiceEvent__e event = new InvoiceEvent__e(
                OpportunityId__c = opp.Id,
                Amount__c = opp.Amount,
                Email__c = opp.Owner.Email
            );
            events.add(event);
        }
    }
    
    // プラットフォームイベントを発行
    EventBus.publish(events);
}
```

---

#### **③ フローでイベントを購読し、請求書を作成**
1. **設定 → フロー → 新規フロー → プラットフォームイベントの購読を選択**
2. **購読するイベント** → `InvoiceEvent__e`
3. **請求書オブジェクト（Invoice__c）を作成**
   - **商談ID** → `InvoiceEvent__e.OpportunityId__c`
   - **請求金額** → `InvoiceEvent__e.Amount__c`
   - **請求日** → `Today()`
4. **メール通知を送信**
   - 送信先 → `InvoiceEvent__e.Email__c`
   - メール本文 → `「商談が成約し、請求書が作成されました。」`

---

## **4. 活用事例②：外部システム（ERP）とのリアルタイム連携**
### **📌 要件**
- **Salesforceで新しい受注（Order）が作成されたら、外部のERPシステムに通知**  
- **ERP側で処理が完了したら、Salesforceの受注ステータスを更新**

### **📌 実装の流れ**
1. **Salesforceで注文データを作成**
2. **プラットフォームイベント（OrderEvent）を発行**
3. **外部システムがOrderEventを購読し、ERPにデータ送信**
4. **ERPが処理完了後、Salesforceの受注ステータスを更新**

---

### **5. 実装**
#### **① プラットフォームイベントを作成**
| フィールド名 | API名 | データ型 |
|-------------|-------------|--------|
| 注文ID | OrderId__c | Lookup (Order) |
| 金額 | Amount__c | Currency |
| ステータス | Status__c | Text |

---

#### **② Apexトリガーでイベントを発行**
```apex
trigger OrderTrigger on Order (after insert) {
    List<OrderEvent__e> events = new List<OrderEvent__e>();

    for (Order ord : Trigger.new) {
        OrderEvent__e event = new OrderEvent__e(
            OrderId__c = ord.Id,
            Amount__c = ord.TotalAmount,
            Status__c = ord.Status
        );
        events.add(event);
    }

    // 外部システムに通知
    EventBus.publish(events);
}
```

---

#### **③ 外部システムが購読（AWS Lambda, Heroku など）**
外部のERPシステムは、Salesforceのプラットフォームイベントを購読し、処理後にSalesforceへ更新リクエストを送信。  
例えば、**AWS Lambda** で受信処理を実装：

```python
import requests
import json

def lambda_handler(event, context):
    for record in event['Records']:
        order_id = record['OrderId__c']
        status = "Processed"

        # Salesforceの受注ステータスを更新
        url = f"https://yourinstance.salesforce.com/services/data/v56.0/sobjects/Order/{order_id}"
        headers = {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN",
            "Content-Type": "application/json"
        }
        data = json.dumps({"Status": status})

        requests.patch(url, headers=headers, data=data)
```

---

## **6. まとめ**
| 活用事例 | プラットフォームイベントの役割 |
|---------|-----------------------------|
| **商談成立後の請求書作成 & メール通知** | 非同期で請求書を作成し、メール通知 |
| **外部システムとのリアルタイム連携** | ERPに受注情報を送信し、処理後にSalesforceを更新 |

**🔹メリット**  
✅ **非同期処理** でユーザーの待ち時間を削減  
✅ **システム間の連携** をリアルタイムで実現  
✅ **フローやApexで柔軟に処理** できる  

**👨‍💻 試験対策ポイント**  
- `EventBus.publish()` でイベント発行  
- **フロー or Apex** でイベントを購読  
- **非同期処理での活用**（外部システム連携や自動化）