# 機能設計書 73-アカウント設定表示

## 概要

本ドキュメントは、Fizzyアプリケーションにおけるアカウント設定画面の表示機能の設計を記述する。

### 本機能の処理概要

アカウント全体の設定情報を表示する機能である。アカウント名、所属ユーザー一覧、エントロピー設定、エクスポート機能、アカウントキャンセル（削除）機能へのアクセスを提供する統合的な設定画面である。

**業務上の目的・背景**：アカウント管理者がアカウント全体の設定を一元的に管理・確認できる必要がある。この画面は、アカウント名の確認・変更、ユーザー管理、データエクスポート、アカウント削除など、アカウントレベルの重要な操作への入り口として機能する。

**機能の利用シーン**：
- アカウント管理者がアカウント設定を確認・変更したい場合
- 新しいユーザーを招待する前にアカウントの状態を確認したい場合
- アカウントのデータをエクスポートしたい場合
- アカウントを削除（キャンセル）したい場合

**主要な処理内容**：
1. 現在のアカウント情報を取得
2. アカウントに所属するアクティブユーザー一覧を取得（アルファベット順）
3. 各種設定セクションを表示（アカウント名、ユーザー一覧、エントロピー、エクスポート、キャンセル）
4. 管理者のみがアクセス可能な機能を条件付きで表示

**関連システム・外部連携**：SaaS版の場合、サブスクリプション情報も表示される。

**権限による制御**：
- 全ユーザー：アカウント設定画面の閲覧は可能
- 管理者（admin）のみ：アカウント名の変更、ユーザーの無効化、ロール変更、エクスポートが可能
- オーナー（owner）のみ：アカウントキャンセルが可能

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 53 | アカウント設定画面 | 主画面 | アカウント全体の設定を表示 |

## 機能種別

データ参照（一覧表示）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | URLパラメータなし | - |

### 入力データソース

- セッション：Current.account（現在のアカウント情報）
- セッション：Current.user（現在のユーザー情報、権限判定用）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| @account | Account | 現在のアカウント情報 |
| @users | User[] | アカウントに所属するアクティブユーザー一覧 |

### 出力先

- 画面表示：account/settings/show.html.erb

## 処理フロー

### 処理シーケンス

```
1. アカウント設定画面にアクセス
   └─ showアクションが実行

2. アカウント情報の取得
   └─ Current.accountから現在のアカウントを取得

3. ユーザー一覧の取得
   └─ @account.users.active.alphabetically.includes(:identity)
   └─ アクティブユーザーをアルファベット順でソート
   └─ Identity情報をeager loadして表示パフォーマンスを最適化

4. 画面レンダリング
   └─ アカウント名セクション（_name.html.erb）
   └─ ユーザー一覧セクション（_users.html.erb）
   └─ エントロピー設定セクション（_entropy.html.erb）
   └─ エクスポートセクション（_export.html.erb）- 管理者/オーナーのみ
   └─ キャンセルセクション（_cancellation.html.erb）- オーナーのみ
   └─ サブスクリプションパネル（SaaS版のみ）
```

### フローチャート

```mermaid
flowchart TD
    A[開始: アカウント設定画面アクセス] --> B[Current.accountを取得]
    B --> C[アクティブユーザー一覧を取得]
    C --> D[show.html.erbをレンダリング]
    D --> E[アカウント名セクション表示]
    E --> F[ユーザー一覧セクション表示]
    F --> G[エントロピー設定セクション表示]
    G --> H{管理者または<br/>オーナー?}
    H -->|Yes| I[エクスポートセクション表示]
    H -->|No| J{オーナー?}
    I --> J
    J -->|Yes| K[キャンセルセクション表示]
    J -->|No| L{SaaS版?}
    K --> L
    L -->|Yes| M[サブスクリプションパネル表示]
    L -->|No| N[終了]
    M --> N
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-73-01 | ユーザー表示順 | ユーザー一覧はアルファベット順（name）で表示 | ユーザー一覧取得時 |
| BR-73-02 | アクティブユーザーのみ | 無効化されたユーザーは一覧に表示しない | ユーザー一覧取得時 |
| BR-73-03 | エクスポート権限 | エクスポート機能は管理者またはオーナーのみ利用可能 | 画面表示時 |
| BR-73-04 | キャンセル権限 | アカウントキャンセルはオーナーのみ利用可能 | 画面表示時 |
| BR-73-05 | 設定変更権限 | アカウント名変更は管理者のみ可能 | 画面表示時（読み取り専用表示の制御） |

### 計算ロジック

特になし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| アカウント取得 | accounts | SELECT | Current.accountから取得済み |
| ユーザー一覧取得 | users | SELECT | アクティブユーザーをアルファベット順で取得 |
| Identity取得 | identities | SELECT | eager loadによりユーザーのIdentity情報を取得 |

### テーブル別操作詳細

#### users

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | account_id, active, name | account_id一致、active=true | alphabetically scope適用 |

#### identities

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | id, email_address | users.identity_idと結合 | includes(:identity)で取得 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 401 | 認証エラー | 未ログイン状態でアクセス | ログイン画面にリダイレクト |

### リトライ仕様

特になし（参照のみの機能）

## トランザクション仕様

参照のみの機能のためトランザクション管理は不要

## パフォーマンス要件

- レスポンス時間：1秒以内
- N+1クエリを防ぐためincludes(:identity)を使用

## セキュリティ考慮事項

- 認証必須（未ログインユーザーはアクセス不可）
- 権限に応じた機能の表示制御（管理者/オーナーのみの機能）
- ユーザー情報（メールアドレス等）の表示は同一アカウント内のユーザーに限定

## 備考

- 本機能は設定の「表示」のみを担当し、実際の設定変更は別機能（No.74: アカウント名変更等）で行われる
- SaaS版ではサブスクリプション情報も表示される

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

アカウント設定に関連するデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Account | `app/models/account.rb` | アカウントモデルの基本構造とリレーション |
| 1-2 | User | `app/models/user.rb` | ユーザーモデルとロール管理 |

**読解のコツ**: Accountモデルのhas_manyリレーション（users, boards, webhooks等）を確認し、アカウントが管理するリソースの全体像を把握する。

#### Step 2: エントリーポイントを理解する

処理の起点となるコントローラーを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SettingsController | `app/controllers/account/settings_controller.rb` | showアクションの実装 |

**主要処理フロー**:
1. **2行目**: `before_action :ensure_admin, only: :update` - 更新は管理者のみ
2. **3行目**: `before_action :set_account` - アカウント情報取得
3. **5-7行目**: showアクションでユーザー一覧を取得
4. **6行目**: `@account.users.active.alphabetically.includes(:identity)` - クエリ最適化

#### Step 3: ビューを理解する

画面表示の実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | show.html.erb | `app/views/account/settings/show.html.erb` | 画面全体のレイアウト |
| 3-2 | _name.html.erb | `app/views/account/settings/_name.html.erb` | アカウント名表示・編集 |
| 3-3 | _users.html.erb | `app/views/account/settings/_users.html.erb` | ユーザー一覧 |
| 3-4 | _entropy.html.erb | `app/views/account/settings/_entropy.html.erb` | エントロピー設定 |
| 3-5 | _export.html.erb | `app/views/account/settings/_export.html.erb` | エクスポート機能 |
| 3-6 | _cancellation.html.erb | `app/views/account/settings/_cancellation.html.erb` | アカウントキャンセル |

**読解のコツ**: show.html.erbでrender文を確認し、各パーシャルがどの条件で表示されるかを把握する。Current.user.admin?やCurrent.user.owner?による条件分岐に注目。

### プログラム呼び出し階層図

```
Account::SettingsController#show
    │
    ├─ set_account (before_action)
    │      └─ @account = Current.account
    │
    └─ @account.users.active.alphabetically.includes(:identity)
           │
           ├─ active (scope) ─────▶ WHERE active = true
           │
           ├─ alphabetically (scope) ─▶ ORDER BY name ASC
           │
           └─ includes(:identity) ──▶ LEFT JOIN identities
```

### データフロー図

```
[入力]                    [処理]                              [出力]

セッション情報 ───▶ Account::SettingsController#show ───▶ show.html.erb
(Current.account)          │
                           ├──▶ usersテーブル検索              ├── _name.html.erb
                           │                                  ├── _users.html.erb
                           ├──▶ identitiesテーブル結合         ├── _entropy.html.erb
                           │                                  ├── _export.html.erb
                           └──▶ 権限チェック                   └── _cancellation.html.erb
                               (Current.user.admin?/owner?)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SettingsController | `app/controllers/account/settings_controller.rb` | コントローラー | アカウント設定の表示・更新 |
| Account | `app/models/account.rb` | モデル | アカウント情報管理 |
| User | `app/models/user.rb` | モデル | ユーザー情報管理 |
| show.html.erb | `app/views/account/settings/show.html.erb` | ビュー | メイン設定画面 |
| _name.html.erb | `app/views/account/settings/_name.html.erb` | ビュー（パーシャル） | アカウント名セクション |
| _users.html.erb | `app/views/account/settings/_users.html.erb` | ビュー（パーシャル） | ユーザー一覧セクション |
| _entropy.html.erb | `app/views/account/settings/_entropy.html.erb` | ビュー（パーシャル） | エントロピー設定セクション |
| _export.html.erb | `app/views/account/settings/_export.html.erb` | ビュー（パーシャル） | エクスポートセクション |
| _cancellation.html.erb | `app/views/account/settings/_cancellation.html.erb` | ビュー（パーシャル） | キャンセルセクション |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義（8行目: resource :settings） |
