# 画面設計書 53-アカウント設定画面

## 概要

本ドキュメントは、Fizzyアプリケーションにおけるアカウント設定画面の設計仕様を記述したものである。

### 本画面の処理概要

本画面は、アカウント全体の設定を管理するための管理者向け画面である。アカウント名の変更、ユーザー管理、自動クローズ設定、データエクスポート、アカウント削除など、アカウント全体に影響する重要な操作を集約している。

**業務上の目的・背景**：組織やチームで共有するFizzyアカウントの管理を一元化するために本画面が存在する。管理者はメンバーの追加・削除・ロール変更を行い、アカウント全体のポリシー（自動クローズ期間など）を設定できる。また、バックアップや移行のためのデータエクスポート機能、不要になったアカウントの削除機能も提供する。

**画面へのアクセス方法**：マイメニュー画面からアカウント設定画面へのリンクをクリックする。またはユーザープロフィール画面から遷移する。URLパス `/account/settings` に直接アクセスすることも可能である。

**主要な操作・処理内容**：
1. アカウント名を変更する（管理者のみ）
2. ユーザー一覧を確認し、フィルタリングする
3. ユーザーのロール（member/admin）を変更する（管理者のみ）
4. ユーザーをアカウントから削除する（管理者のみ）
5. 「Invite people」リンクから参加コード画面へ遷移
6. 自動クローズ（Entropy）設定を変更する（管理者のみ）
7. アカウントデータをエクスポートする（管理者/オーナーのみ）
8. アカウントを削除（キャンセル）する（オーナーのみ）

**画面遷移**：マイメニュー画面、ユーザープロフィール画面から遷移してくる。「Invite people」リンクから参加コード表示画面、「Begin export...」からエクスポートダイアログ、「Delete account」からキャンセルダイアログへ遷移する。

**権限による表示制御**：
- 全ユーザー：アカウント名の表示、ユーザー一覧の閲覧が可能
- 管理者（admin）：アカウント名の編集、ユーザーロール変更、ユーザー削除、Entropy設定変更、エクスポート機能が使用可能
- オーナー（owner）：上記に加えてアカウント削除（キャンセル）が可能
- 非管理者には「Only admins can change these settings」メッセージを表示

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 73 | アカウント設定表示 | 主機能 | アカウント全体の設定を表示 |
| 74 | アカウント名変更 | 補助機能 | アカウント名を変更 |
| 64 | ユーザー一覧表示 | 補助機能 | アカウント内のユーザー一覧を表示 |
| 67 | ユーザー無効化 | 補助機能 | ユーザーを無効化（退会） |
| 70 | ロール変更 | 補助機能 | ユーザーのロール（member/admin）を変更 |
| 77 | アカウントデータエクスポート | 補助機能 | アカウント全体のデータをエクスポート |
| 75 | アカウントキャンセル | 補助機能 | アカウントをキャンセル（削除予約） |

## 画面種別

設定

## URL/ルーティング

| メソッド | パス | アクション |
|---------|------|-----------|
| GET | /account/settings | show（設定画面表示） |
| PUT/PATCH | /account/settings | update（アカウント名更新） |

## 入出力項目

| 項目名 | 項目ID | 型 | 必須 | 入力形式 | 説明 |
|--------|--------|-----|------|----------|------|
| アカウント名 | name | text | ○ | テキスト入力 | アカウントの表示名（管理者のみ編集可） |

## 表示項目

| 項目名 | 説明 |
|--------|------|
| ページタイトル | "Account Settings" |
| 権限警告 | "Only admins can change these settings"（非管理者向け） |
| アカウント名セクション | アカウント名の表示・編集フォーム |
| ユーザー一覧セクション | "People on this account" - フィルター・一覧・招待リンク |
| 自動クローズセクション | "Auto close" - Entropy設定 |
| エクスポートセクション | "Export account data"（管理者/オーナーのみ） |
| キャンセルセクション | "Cancel account"（オーナーのみ） |
| サブスクリプションセクション | SaaSモード時のみ表示 |

## イベント仕様

### 1-アカウント名変更

アカウント名入力フィールドを編集し、送信ボタンを押下する。

1. フォームバリデーション（name必須）
2. PUT/PATCHリクエストを `/account/settings` に送信
3. 管理者権限を確認（ensure_admin）
4. アカウント名を更新
5. 同じ画面にリダイレクト

### 2-ユーザーフィルター

フィルター入力フィールドにテキストを入力すると、ユーザー一覧がリアルタイムでフィルタリングされる。

### 3-ユーザーロール変更

ユーザー行の王冠アイコンをクリックすると、ロール（member/admin）が切り替わる。

1. チェックボックス変更でフォーム自動送信
2. PATCH `/users/:id/role` にリクエスト
3. ロールをmember↔admin間でトグル

### 4-ユーザー削除

ユーザー行のマイナスボタンをクリックすると、確認ダイアログが表示される。

1. 確認ダイアログで「OK」を選択
2. DELETE `/users/:id` にリクエスト
3. ユーザーをアカウントから削除

### 5-Invite people リンク押下

参加コード表示画面に遷移する。

### 6-Begin export... ボタン押下

エクスポート確認ダイアログが表示される。

1. ダイアログで「Start export」を選択
2. POST `/account/exports` にリクエスト
3. エクスポートジョブをキューに追加
4. アカウント設定画面にリダイレクト、通知メッセージ表示

### 7-Delete account ボタン押下

アカウント削除確認ダイアログが表示される。

1. ダイアログで「Delete my account」を選択
2. POST `/account/cancellation` にリクエスト
3. アカウント削除処理を開始（30日後に完全削除）

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 画面表示 | accounts | SELECT | アカウント情報取得 |
| 画面表示 | users | SELECT | ユーザー一覧取得 |
| アカウント名変更 | accounts | UPDATE | nameカラム更新 |
| ユーザーロール変更 | users | UPDATE | roleカラム更新 |
| ユーザー削除 | users | DELETE/UPDATE | ユーザー無効化 |
| エクスポート開始 | account_exports | INSERT | エクスポートジョブ作成 |
| アカウント削除 | accounts | UPDATE | cancelled_at設定 |

### テーブル別更新項目詳細

#### accounts

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | - | Current.account | 現在のアカウント |
| UPDATE | name | フォーム入力値 | アカウント名 |
| UPDATE | cancelled_at | 現在時刻 | アカウント削除時 |

#### users

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | - | active.alphabetically | アクティブユーザーをアルファベット順で取得 |
| UPDATE | role | "admin" / "member" | ロール切り替え |
| DELETE/UPDATE | - | ユーザー無効化処理 | 削除ボタン押下時 |

#### account_exports

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | account_id | Current.account.id | |
| INSERT | user_id | Current.user.id | エクスポート要求者 |
| INSERT | status | "pending" | 初期ステータス |

## メッセージ仕様

| 種別 | メッセージ | 表示条件 |
|------|----------|----------|
| 情報 | Only admins can change these settings | 非管理者がアクセス時 |
| 情報 | Export started. You'll receive an email when it's ready. | エクスポート開始時 |
| 確認 | Are you sure you want to permanently remove this person from the account? | ユーザー削除確認 |
| 確認 | Delete your account? | アカウント削除確認ダイアログ |
| 警告 | All users, including you, will lose access | アカウント削除確認ダイアログ内 |
| 警告 | After 30 days your data will be permanently deleted | アカウント削除確認ダイアログ内 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 未ログイン | ログイン画面にリダイレクト |
| 非管理者がアカウント名変更を試行 | 403 Forbidden |
| 非オーナーがアカウント削除を試行 | キャンセルセクション非表示 |
| エクスポート制限超過（10件） | 429 Too Many Requests |

## 備考

- ユーザー一覧はフィルターとナビゲーション可能なリスト形式
- Entropy設定はボードごとにオーバーライド可能（グローバルデフォルト）
- サブスクリプションパネルはSaaSモード（Fizzy.saas?）時のみ表示
- アカウント削除は即時ではなく、30日後に完全削除される

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | account.rb | `app/models/account.rb` | アカウントモデル、関連定義（users, exports等） |
| 1-2 | user.rb | `app/models/user.rb` | ユーザーモデル、role enum、admin?/owner?メソッド |
| 1-3 | export.rb | `app/models/export.rb` | エクスポートモデル、ステータス管理 |

**読解のコツ**: `Current.account`でログイン中ユーザーの所属アカウントにアクセスする。`Current.user.admin?`で管理者権限を判定。

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

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

**主要処理フロー**:
1. **2行目**: before_action :ensure_admin - updateは管理者のみ
2. **3行目**: before_action :set_account - Current.accountを@accountに設定
3. **5-7行目**: showアクション - アクティブユーザー一覧を取得
4. **9-11行目**: updateアクション - アカウント名更新

#### 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 | _user.html.erb | `app/views/account/settings/_user.html.erb` | 個別ユーザー行、ロール変更・削除 |
| 3-5 | _entropy.html.erb | `app/views/account/settings/_entropy.html.erb` | 自動クローズ設定 |
| 3-6 | _export.html.erb | `app/views/account/settings/_export.html.erb` | エクスポートダイアログ |
| 3-7 | _cancellation.html.erb | `app/views/account/settings/_cancellation.html.erb` | アカウント削除ダイアログ |

**主要処理フロー**:
- **6-8行目（show.html.erb）**: 非管理者向け警告メッセージ
- **14行目**: _nameパーシャルでアカウント名セクション
- **15行目**: _usersパーシャルでユーザー一覧セクション
- **19行目**: _entropyパーシャルで自動クローズ設定
- **20行目**: _exportパーシャル（admin/ownerのみ）
- **21行目**: _cancellationパーシャル
- **25行目**: SaaSモード時のみサブスクリプションパネル

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

```
ブラウザ
    │
    ├─ GET /account/settings
    │      └─ Account::SettingsController#show
    │             ├─ set_account → @account = Current.account
    │             └─ @users = @account.users.active.alphabetically
    │
    ├─ PUT /account/settings
    │      └─ Account::SettingsController#update
    │             ├─ ensure_admin (before_action)
    │             └─ @account.update!(name: params[:name])
    │
    ├─ PATCH /users/:id/role
    │      └─ Users::RolesController#update
    │
    ├─ DELETE /users/:id
    │      └─ UsersController#destroy
    │
    ├─ POST /account/exports
    │      └─ Account::ExportsController#create
    │             └─ Account::Export.create!.build_later
    │
    └─ POST /account/cancellation
           └─ Account::CancellationsController#create
```

### データフロー図

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

アカウント名 ────────────▶ SettingsController#update ────▶ accounts更新
                                                           └▶ リダイレクト

ロールチェックボックス ──▶ RolesController#update ───────▶ users.role更新

削除ボタン ──────────────▶ UsersController#destroy ──────▶ ユーザー無効化

エクスポートボタン ──────▶ ExportsController#create ────▶ account_exports作成
                                                           └▶ ジョブキュー

削除ボタン ──────────────▶ CancellationsController ─────▶ cancelled_at設定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| settings_controller.rb | `app/controllers/account/settings_controller.rb` | コントローラ | 設定画面の制御 |
| exports_controller.rb | `app/controllers/account/exports_controller.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` | パーシャル | ユーザー一覧セクション |
| _user.html.erb | `app/views/account/settings/_user.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` | パーシャル | 削除セクション |
| filter_controller.js | `app/javascript/controllers/filter_controller.js` | Stimulus | ユーザーフィルター |
| dialog_controller.js | `app/javascript/controllers/dialog_controller.js` | Stimulus | モーダルダイアログ |
