# 画面設計書 7-参加コード無効画面

## 概要

本ドキュメントは、Fizzyアプリケーションの参加コード無効画面（`app/views/join_codes/inactive.html.erb`）の設計仕様を記述したものです。

### 本画面の処理概要

参加コード無効画面は、使用回数制限に達した参加コードでアクセスした場合に表示されるエラー画面です。ユーザーに対して参加コードが無効であることを通知し、管理者に新しいリンクの発行を依頼するよう案内します。

**業務上の目的・背景**：参加コードには使用回数制限が設けられており、セキュリティと管理上の理由から一定回数を超えると無効化されます。この画面は、無効化された参加コードを使用しようとしたユーザーに対して、状況を明確に伝え、次のアクション（管理者への連絡）を案内する役割を果たします。

**画面へのアクセス方法**：参加コードを含むURL（`/join/:code`）にアクセスした際、そのコードが使用回数制限に達している場合に自動的に表示されます。直接この画面にアクセスすることはできません。

**主要な操作・処理内容**：
1. 画面に表示されるメッセージを確認する
2. 「OK」ボタンをクリックしてFizzyのホームページに遷移する
3. または、アカウントの管理者に連絡して新しい参加コードを発行してもらう

**画面遷移**：
- 遷移元：参加コード入力画面（`/join/:code`）- コードが無効な場合
- 遷移先：Fizzyホームページ（https://www.fizzy.do）

**権限による表示制御**：
- 認証・未認証どちらでもアクセス可能（参加コード入力画面と同様）
- 参加コードの有効性チェック後にのみ表示

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 4 | 参加コードによるアカウント参加 | 主機能 | 無効な参加コード使用時のエラー表示 |

## 画面種別

エラー表示

## URL/ルーティング

| 項目 | 値 |
|------|-----|
| URL | `/join/:code`（参加コード入力画面と同じURL） |
| HTTPメソッド | GET |
| コントローラー | `JoinCodesController` |
| アクション | `new`（ensure_join_code_is_validでinactiveをrender） |
| レイアウト | `public` |
| HTTPステータス | 410 Gone |

## 入出力項目

### 入力項目

なし（エラー画面のため）

### 出力項目

なし

## 表示項目

| No | 項目名 | 表示条件 | データソース | 備考 |
|----|--------|----------|-------------|------|
| 1 | タイトル「That code is all used up」 | 常時 | 固定文言 | - |
| 2 | 案内メッセージ | 常時 | @join_code.account.name | 動的にアカウント名を含む |
| 3 | 「OK」ボタン | 常時 | 固定文言 | Fizzyホームページへのリンク |
| 4 | フッター | 常時 | _footer部分テンプレート | サポートメール連絡先 |

## イベント仕様

### 1-「OK」ボタン押下

**トリガー**: リンククリック

**処理**: Fizzyホームページ（https://www.fizzy.do）に遷移

**備考**: 外部リンクへの遷移

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

なし（エラー画面のため）

## メッセージ仕様

| No | メッセージ種別 | メッセージ内容 | 表示条件 |
|----|--------------|---------------|---------|
| 1 | エラー | That code is all used up | 常時（タイトル） |
| 2 | 案内 | Ask someone from [アカウント名] to send you a new link or increase the limit. | 常時 |

## 例外処理

なし（この画面自体がエラーハンドリングの結果）

## 備考

- 本画面は`JoinCodesController#ensure_join_code_is_valid`のbefore_actionから`render :inactive, status: :gone`で表示される
- HTTPステータスコード410（Gone）を返し、リソースが永続的に利用不可であることを示す
- 参加コードが存在しない場合（nil）は、この画面ではなく404 Not Foundが返される
- 参加コードの`active?`メソッド（usage_count < usage_limit）がfalseの場合にこの画面が表示される
- 「OK」ボタンは外部サイト（fizzy.do）へのリンクであり、アプリケーション内の遷移ではない
- アカウント名が動的に表示されるため、どの組織の参加コードが無効になったかがユーザーにわかる

---

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

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

### 推奨読解順序

#### Step 1: エラー発生条件を理解する

まず、この画面が表示される条件を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | join_codes_controller.rb | `app/controllers/join_codes_controller.rb` | ensure_join_code_is_validメソッド、renderの条件 |
| 1-2 | join_code.rb | `app/models/account/join_code.rb` | active?メソッド、usage_countとusage_limitの関係 |

**読解のコツ**: `ensure_join_code_is_valid`メソッドの条件分岐に注目。`@join_code.nil?`の場合は404、`!@join_code.active?`の場合はこの画面が表示されます。

#### Step 2: ビューとテンプレートを理解する

画面表示のテンプレートを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | inactive.html.erb | `app/views/join_codes/inactive.html.erb` | 表示内容、動的要素 |

**主要処理フロー**:
- **1行目**: タイトル設定（固定文言）
- **6行目**: アカウント名を含む案内メッセージ
- **9行目**: 外部リンクへの「OK」ボタン

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

```
ユーザーアクセス: /join/:code
    │
    └─ JoinCodesController#new
           │
           ├─ [before_action] set_join_code
           │      └─ Account::JoinCode.find_by(code:)
           │
           └─ [before_action] ensure_join_code_is_valid
                  │
                  ├─ [@join_code.nil?]
                  │      └─ head :not_found (404)
                  │
                  └─ [!@join_code.active?]
                         └─ render :inactive, status: :gone (410)
                                │
                                └─ inactive.html.erb 表示
```

### データフロー図

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

:code (URL) ─────────▶ JoinCodesController#new
                              │
                              ├──▶ set_join_code
                              │        │
                              │        └─▶ Account::JoinCode.find_by
                              │
                              └──▶ ensure_join_code_is_valid
                                       │
                                       └─▶ active? チェック
                                                │
                                                └─[false]─▶ render :inactive
                                                                  │
                                                                  └─▶ 410 Gone + 画面表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| join_codes_controller.rb | `app/controllers/join_codes_controller.rb` | コントローラー | 参加コード処理の制御 |
| inactive.html.erb | `app/views/join_codes/inactive.html.erb` | ビュー | 参加コード無効画面テンプレート |
| _footer.html.erb | `app/views/sessions/_footer.html.erb` | パーシャル | フッター表示 |
| join_code.rb | `app/models/account/join_code.rb` | モデル | 参加コードの管理 |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義 |
