Salesforceのカスタム設定

Salesforceの**カスタム設定**や**階層カスタム設定**は、特定のデータを組織全体やユーザーごとに設定できる便利な仕組みです。Sales Cloudの標準オブジェクト（例えば「取引先（Account）」や「商談（Opportunity）」）と組み合わせて、具体的にどのように活用できるか整理しました。

---

## 1. **カスタム設定とは？**
カスタム設定は、管理者が**設定値を保存**し、それをApexやフローで活用できる機能です。  
2種類あります。
- **リストカスタム設定**：組織全体で使うデータの一覧（例：地域ごとの税率設定）
- **階層カスタム設定**：プロファイルやユーザー単位で異なる設定を管理（例：営業担当者ごとの割引率）

---

## 2. **活用事例①（リストカスタム設定）：商談のデフォルト割引率**
**目的**: 営業担当が商談（Opportunity）を作成するとき、**製品ごとの割引率を自動適用**したい。

### **手順**
1. **カスタム設定を作成**
   - 設定 → 「カスタム設定」→ 「新規」  
   - 名前: **ProductDiscount（製品割引設定）**  
   - 種類: **リストカスタム設定**

2. **カスタム設定にデータを追加**
   | 製品名      | 割引率 (%) |
   |------------|----------|
   | 製品A      | 10%      |
   | 製品B      | 15%      |
   | 製品C      | 5%       |

3. **Apexトリガーで自動適用**
   ```apex
   trigger ApplyDiscount on Opportunity (before insert, before update) {
       for (Opportunity opp : Trigger.new) {
           if (opp.Product__c != null) {  // 製品が選択されている場合
               ProductDiscount__c discount = ProductDiscount__c.getValues(opp.Product__c);
               if (discount != null) {
                   opp.Discount__c = discount.DiscountRate__c;
               }
           }
       }
   }
   ```

**効果**:
- 営業担当が手動で割引率を入力する手間を省ける。
- 製品ごとに統一された割引ルールを適用できる。

---

## 3. **活用事例②（階層カスタム設定）：営業担当ごとの特別割引率**
**目的**: 営業担当ごとに適用できる**特別割引率**を設定し、商談の割引上限を制御したい。

### **手順**
1. **カスタム設定を作成**
   - 設定 → 「カスタム設定」→ 「新規」  
   - 名前: **UserDiscountSetting（営業担当割引設定）**  
   - 種類: **階層カスタム設定**
   - オブジェクトフィールド:
     - **最大割引率（Max_Discount__c）**（数値）

2. **ユーザーごとの最大割引率を設定**
   | ユーザー | 最大割引率 (%) |
   |--------|----------|
   | 営業A   | 20%     |
   | 営業B   | 15%     |
   | 営業C   | 10%     |

3. **Apexトリガーで適用**
   ```apex
   trigger ValidateDiscount on Opportunity (before insert, before update) {
       for (Opportunity opp : Trigger.new) {
           UserDiscountSetting__c userSetting = UserDiscountSetting__c.getInstance(UserInfo.getUserId());
           if (userSetting != null && opp.Discount__c > userSetting.Max_Discount__c) {
               opp.Discount__c = userSetting.Max_Discount__c;
           }
       }
   }
   ```

**効果**:
- 営業担当ごとに適用可能な最大割引率を設定できる。
- 割引率の管理を簡単にし、手動で制限を確認する手間を削減。

---

## 4. **どんなときにカスタム設定を使うべき？**
✅ **リストカスタム設定**（組織全体で共通の設定を管理）
- 例: 地域ごとの税率、製品ごとの標準割引、キャンペーン情報

✅ **階層カスタム設定**（プロファイルやユーザーごとに設定を変えたい）
- 例: 営業担当ごとの割引上限、部署ごとの商談目標、国別の通貨設定

---

## **まとめ**
- **カスタム設定**を使うと、**Sales Cloudの標準オブジェクトと組み合わせて便利なルールを作れる**。
- **リストカスタム設定**は「製品の割引率」や「地域ごとの税率」など、共通のデータを管理するのに最適。
- **階層カスタム設定**は「営業担当ごとの割引上限」など、ユーザーごとに異なるルールを適用するのに便利。

Salesforceでカスタム設定を活用すれば、**Apexコードをシンプルに保ちながら、管理者が設定を柔軟に変更**できるようになります！

# 問題
階層カスタム設定は、Salesforceのプロファイルごとに特定のURLを保存します。開発者が現在のユーザーのプロファイルの正しいURLを取得し、これをVisualforceページに表示するために使用できるステートメントはどれですか？

□ {！$Setup.Url_Settings__c.[$ Profile.Id].URL__c}
□ {！$Setup.Url_Settings__c.[Profile.Id].URL__c}
□ {！$Setup.Url_Settings__c.URL__c}
□ {！$Setup.Url_Settings__c.Instance.[Profile.Id].URL__c}

# 解説
正しいステートメントは次のとおりです。  

✅ **`{!$Setup.Url_Settings__c[$Profile.Id].URL__c}`**  

### **解説**
Salesforceの**階層カスタム設定**は、**プロファイルやユーザーごとに異なるデータを持てる**設定です。  
Visualforceページで現在のユーザーのプロファイルに対応する設定値を取得する場合、以下の構文を使います。  

```html
{!$Setup.カスタム設定名[Profile.Id].フィールド名}
```

今回のケースでは、  
- **カスタム設定名** → `Url_Settings__c`  
- **プロファイルIDをキーに取得** → `[$Profile.Id]`  
- **取得するフィールド** → `URL__c`  

したがって、  
✅ `{!$Setup.Url_Settings__c[$Profile.Id].URL__c}` が正解です。  

---

### **誤りのある選択肢の解説**
❌ **`{!$Setup.Url_Settings__c.[Profile.Id].URL__c}`**  
→ `.` の後に `[Profile.Id]` が来ており、構文エラー。  

❌ **`{!$Setup.Url_Settings__c.URL__c}`**  
→ これは**リストカスタム設定**の書き方で、階層カスタム設定ではプロファイルIDの指定が必要。  

❌ **`{!$Setup.Url_Settings__c.Instance.[Profile.Id].URL__c}`**  
→ `Instance` は不要。`[$Profile.Id]` を直接指定すればOK。  

---

### **補足**
もし**ユーザーごとの設定**を取得したい場合は、次のように `UserInfo.getUserId()` を使うこともできます。  

```apex
String url = Url_Settings__c.getInstance(UserInfo.getUserId()).URL__c;
```

Visualforceで使う場合は `{!$Setup.Url_Settings__c[$User.Id].URL__c}` のように書きます。