Salesforceのデータ処理の仕組み

下記の図は、Salesforceの**トランザクション処理の流れ**を示したものです。  
具体的なオブジェクトやデータを用いて、わかりやすく整理しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274036/3fcd5bd9-7b99-4464-a510-5e217f5a0e1d.png)


---

## **Salesforceのデータ処理の流れ（トランザクションのライフサイクル）**
Salesforceでは、データが保存されるまでに複数の処理ステップが存在します。これを理解することで、カスタマイズ時の動作やエラーの原因を把握しやすくなります。

### **1. Trigger.newの初期化**
レコードが作成または更新される際、`Trigger.new`が初期化され、データがSalesforceのシステム検証ルール（標準の必須項目チェックなど）やカスタム検証ルールにかけられます。

**例:**
- 「商談」オブジェクトの`金額`項目が必須の場合、空欄だとエラーになる。

---

### **2. Before Trigger（レコード保存前の処理）**
レコードがデータベースに保存される前に実行されるApexトリガー。

**例:**
- `before insert`で`取引先名`を自動入力する。
- `before update`で`ステータス`が「契約済み」なら`契約日`を自動入力する。

```apex
trigger OpportunityTrigger on Opportunity (before insert, before update) {
    for (Opportunity opp : Trigger.new) {
        if (opp.StageName == 'Closed Won' && opp.CloseDate == null) {
            opp.CloseDate = Date.today();
        }
    }
}
```

---

### **3. 重複ルール（Duplicate Rules）**
Salesforceの標準機能で、同じデータが登録されないようにチェック。

**例:**
- 既に登録されている`取引先`と同じ名前の`取引先`を作成しようとすると警告が出る。

---

### **4. 割り当てルール（Assignment Rules）**
ケースやリードに対し、自動的に担当者を割り当てるルール。

**例:**
- `リードの地域`が「東京」なら`担当者A`に割り当てる。

---

### **5. 自動レスポンスルール（Auto-Response Rules）**
リードやケースに対して、自動返信メールを送る機能。

**例:**
- `サポート問い合わせ`を受け付けたら、自動で「お問い合わせを受け付けました」のメールを送信。

---

### **6. エスカレーションルール（Escalation Rules）**
ケースが一定時間解決されない場合、マネージャーに通知したり、優先度を変更する。

**例:**
- `優先度:高`のケースが24時間以上放置されたら、`マネージャー`に通知する。

---

### **7. 保存（Database Commit）**
ここまでの処理を通過したレコードはデータベースに保存される。

---

### **8. After Trigger（レコード保存後の処理）**
データが保存された後に実行されるApexトリガー。

**例:**
- `商談`が作成されたら、自動で関連する`タスク`を作成。

```apex
trigger AfterInsertOpportunity on Opportunity (after insert) {
    List<Task> tasks = new List<Task>();
    for (Opportunity opp : Trigger.new) {
        Task newTask = new Task(
            Subject = 'フォローアップ',
            WhatId = opp.Id,
            Status = 'Not Started'
        );
        tasks.add(newTask);
    }
    insert tasks;
}
```

---

### **9. ワークフロールール（Workflow Rules）**
フィールド更新、タスク作成、メール送信などの処理を自動化。

**例:**
- `商談のステージ`が「成約」に変更されたら、`契約日`を自動入力。

---

### **10. プロセスビルダー（Process Builder）**
ワークフロールールより高度な自動化を実現。

**例:**
- `商談`が「成約」になったら、自動で`請求レコード`を作成。

---

### **11. コミット（Commit）**
トランザクションの確定処理。これ以降はロールバック不可。

---

### **12. コミット後のロジック**
データの保存が確定した後に、外部システム連携や通知を行う。

**例:**
- `商談`が作成されたら、`Slack`に通知を送る。
- `顧客データ`を外部システムに同期する。

```apex
public class OpportunityNotification {
    @future(callout=true)
    public static void sendSlackMessage(String message) {
        HttpRequest req = new HttpRequest();
        req.setEndpoint('https://slack.com/api/chat.postMessage');
        req.setMethod('POST');
        req.setBody('{"text": "' + message + '"}');
        Http http = new Http();
        HttpResponse res = http.send(req);
    }
}
```

---

## **まとめ**
| ステップ | 処理内容 | 例 |
|----------|--------|----|
| 1. Trigger.new 初期化 | システム検証・カスタム検証 | `必須項目チェック` |
| 2. Before Trigger | レコード保存前の処理 | `取引先名自動入力` |
| 3. 重複ルール | 既存データのチェック | `同じ名前の取引先を防ぐ` |
| 4. 割り当てルール | レコードの自動割り当て | `リードを地域別に担当者割当` |
| 5. 自動レスポンスルール | 自動メール送信 | `問い合わせ受付の自動返信` |
| 6. エスカレーションルール | ケースの優先度変更 | `放置されたケースをマネージャーに通知` |
| 7. 保存 | データベースに保存 | `正式にデータ確定` |
| 8. After Trigger | レコード保存後の処理 | `タスク自動作成` |
| 9. ワークフロー | シンプルな自動化 | `商談のステージ変更で契約日更新` |
| 10. プロセスビルダー | 高度な自動化 | `商談成立で請求書作成` |
| 11. コミット | トランザクション確定 | `データ確定処理` |
| 12. コミット後のロジック | 外部システム連携 | `Slack通知や外部API連携` |

この流れを理解することで、Salesforceの自動化を活用し、システム設計の最適化が可能になります！



# bk
---

## **📌 例：商談 (Opportunity) の作成処理の流れ**
あなたがSalesforceで**新しい商談 (Opportunity) を作成**するとき、データの処理は以下の順番で実行されます。

---

### **🔹 1. Trigger.new の初期化**
**（システム入力規則 & カスタム入力規則の適用）**
- **例**：UIから商談を新規作成したとき、`Trigger.new` という変数に、新しいレコードの情報が入る。

---
### **🔹 2. Beforeトリガー (Before Insert, Before Update)**
- **処理の前に実行されるApexトリガー**  
- **例**：「商談の金額 (Amount) が 10,000 円以下なら、自動でステージを '見込み' にする」

```apex
trigger OpportunityTrigger on Opportunity (before insert, before update) {
    for (Opportunity opp : Trigger.new) {
        if (opp.Amount < 10000) {
            opp.StageName = '見込み';
        }
    }
}
```

---
### **🔹 3. 重複ルール**
- **同じデータがすでに存在しないかチェック**
- **例**：「同じ取引先 (Account) に同じ商談名の商談があれば、作成をブロックする」

---
### **🔹 4. 割り当てルール**
- **商談の担当者を自動で決定**
- **例**：「商談の地域が '東京' なら、担当者を佐藤にする」

---
### **🔹 5. 自動レスポンスルール**
- **自動的に顧客にメールを送信**
- **例**：「新規商談が作成されたら、顧客に自動で「お問い合わせありがとうございます」とメールを送る」

---
### **🔹 6. エスカレーションルール**
- **特定の条件で商談を上位マネージャーにエスカレーション**
- **例**：「商談の金額が1,000,000円以上なら、上司に通知する」

---
### **🔹 7. 保存 (データベースに保存)**
- **ここで初めてデータがSalesforceに保存される**

---
### **🔹 8. Afterトリガー (After Insert, After Update)**
- **レコードが保存された後に実行**
- **例**：「商談が作成されたら、関連するカスタムオブジェクト '見積書' を自動作成する」

```apex
trigger CreateQuote on Opportunity (after insert) {
    for (Opportunity opp : Trigger.new) {
        Quote__c quote = new Quote__c();
        quote.Opportunity__c = opp.Id;
        quote.TotalAmount__c = opp.Amount;
        insert quote;
    }
}
```

---
### **🔹 9. ワークフロールール**
- **レコード更新時に実行する自動処理**
- **例**：「商談のステージが '交渉中' になったら、自動で 'フォローアップタスク' を作成」

---
### **🔹 10. プロセス (Process Builder)**
- **より高度な自動化処理**
- **例**：「商談が '成立' になったら、取引先責任者に感謝メールを送る」

---
### **🔹 11. コミット**
- **データベースへの最終確定**
- **例**：「すべての処理が問題なければ、データベースに完全保存」

---
### **🔹 12. コミット後の処理**
- **メール送信、アウトバウンドメッセージ、イベント処理など**
- **例**：「商談成立後、会計システムにデータを送る」

---

## **📌 まとめ**
Salesforceでデータを保存する際は、以下のように**順番に処理**が実行される。

1. **データの初期化**（Trigger.new, 入力規則）
2. **Beforeトリガー**（データを保存前に修正）
3. **重複ルール**（同じデータがないか確認）
4. **割り当てルール・レスポンスルール**（担当者決定 & メール送信）
5. **エスカレーションルール**（必要なら上司へ通知）
6. **データ保存**
7. **Afterトリガー & 自動処理**（ワークフロー、プロセスビルダー）
8. **コミット**
9. **コミット後の処理**（メール送信、外部システム連携）

この流れを理解すれば、Salesforceの**データ処理の仕組み**がよくわかる！