# 会員サイト — サイト設定 詳細設計（Monaka）

**最終更新: 2026-05-27**

## ユーザー向け用語（必須）

| 画面・説明で使う語 | 意味 | DB（開発者向け・変更しない） |
|-------------------|------|------------------------------|
| **コース** | 教材（レッスン・グループ） | `bundle_courses` |
| **コースの結合** | 複数コースをまとめた開放単位（旧称「バンドルコース」は使わない） | `course_bundles` |

本書は、会員サイト全体の基本挙動・決済連携・コース整理に関する **設計の正本** です。画面実装の Single Source of Truth は引き続き `docs/funnel-spec.md` §10.1（会員サイト）と、本書の **実装対応表** を併用してください。

---

## 概要

会員サイトの運用は、単一の「サイト設定」画面だけでは完結しません。Monaka では次の **3 概念** と **複数の管理画面** に分かれています。

| カテゴリ | 役割 | Monaka での主な画面 |
|----------|------|---------------------|
| **1. 基本設定** | サイト名・URL・ロゴ・公開状態など | **サイト設定**（`site.edit`）・**URL管理**（`site.url`）・**ページ設定**（`site.page-settings`） |
| **2. 決済連携** | 購入後の会員作成・コースの結合開放 | **初期設定 → 決済連携**・**商品登録 → プラン**（会員サイト画面内には置かない） |
| **3. コース整理** | 教材の分類・表示 | **コース**・**コースの結合**・会員マイページの **絞り込み**（専用「カテゴリ」テーブルは未実装） |

この設定は表示だけでなく、次に影響します。

- 会員サイトの URL（`/member/{slug}/…`）
- ログイン導線
- 購入後の自動開放（実装予定）
- 決済完了後の遷移（ファネル／商品側）
- コースの表示整理と **閲覧権限**（コースの結合）

---

## 概念整理（必須）

| 用語 | DB / モデル | 役割 |
|------|-------------|------|
| **コース** | `bundle_courses` | 教材そのもの（グループ・レッスン） |
| **コースの結合** | `course_bundles` + `course_bundle_items` | **開放権限**（複数コースをまとめて付与・購入後開放） |
| **コースカテゴリ**（本設計書の §3） | *未実装* | **表示整理**用の階層分類（権限は増えない） |

### よくある設計ミス

1. **カテゴリだけ設定した** → 閲覧権限は増えない（付与または購入後開放が必要）。
2. **コースだけ作った** → 会員には見えない（受講生管理でコース／コースの結合を付与するまで）。
3. **商品とコースだけ紐付け、コースの結合未設定** → ログインできても中身が空に見える（「含むコース: 0件」）。

### 推奨構造

**小規模**

```text
商品プラン
  → 購入後に開放するコースの結合（または手動でコース単体付与）
    → コース（教材）
```

**大規模（カテゴリ実装後を想定）**

```text
商品プラン
  → コースの結合（権限）
    → コース（教材）
      → カテゴリ（表示整理のみ）
```

---

## 管理画面の配置（Monaka 現行）

| 左メニュー（サイト選択後） | ルート例 | 本設計書の章 |
|---------------------------|----------|--------------|
| コース | `site.show` | コース・結合（教材） |
| コースの結合 | `site.bundle-settings` | §2 購入後開放の対象 |
| 受講生管理 | `site.members.index` | 手動開放 |
| お知らせ管理 | `site.announcements.*` | 基本設定の一部（告知） |
| URL管理 | `site.url` | §1 サイトURL（ログイン） |
| **サイト設定** | `site.edit` | §1 基本設定（コア）＋画面上部に **3区分マップ**・関連画面カード（2026-05-27 UI 更新） |
| ページ設定 | `site.page-settings` | §1 表示・ログイン・固定ページ |

**初期設定**（横断）: `setting.setup` → 決済連携（`setting.payment`）・商品登録（`setting.products` / `product.show`）

---

# 1. 基本設定

## 機能概要

会員サイト全体の基本情報・URL・表示・アクセスの土台を設定する。

## 実装対応表（§1）

| 設計項目 | Monaka 状態 | 画面 / 保存先 | 備考 |
|----------|-------------|---------------|------|
| サイト名 | **実装済** | `site.edit` → `membership_sites.name` | ログイン・管理表示 |
| サイトURL | **一部** | `site.edit`（スラッグ）・`site.url`（ログインURL表示） | 形式: `https://{host}/member/{slug}/login`。スラッグは英数字・`-`・`_` |
| サイト説明 | **実装済** | `site.edit` → `description` | SEO/OGP 専用項目は未分離 |
| ロゴ画像 | **実装済** | `site.edit` / `site.create` | アップロード・メディア選択。png/jpg/gif/webp・5MB以下 |
| favicon | **未実装** | — | ファネル用 `custom_domains.favicon_file` は別機能 |
| 独自ドメイン | **未実装**（会員サイト専用UI） | `membership_sites.custom_domain` 列は存在 | 公開URL用ドメインは `setting.domain`（`target_type` funnel/site）。会員サイトホスト直結は要設計 |
| 公開状態 | **実装済** | `site.edit` → `status` active/draft | 下書きは会員ログイン不可 |
| ログイン必須設定 | **固定** | 会員エリア全体 | 未ログインはログイン画面へ。ゲスト閲覧トグルは未実装 |
| TOPページ設定 | **一部** | ログイン後 → `member.dashboard` 固定 | 固定ページ・レッスン直リンクをログイン後TOPにする設定は未実装 |
| 会員登録許可 | **未実装** | 受講生は管理画面で追加 | 一般ユーザーの自己登録 ON/OFF なし |
| SEO title / description / keyword | **未実装** | — | |
| OGP（タイトル・説明・画像） | **未実装** | — | |
| コピーライト | **一部** | **ページ設定 → コースページ** フッター | サイト全体専用項目ではない |
| 利用規約リンク | **未実装** | — | ヘッダー右上リンクで外部URLは可 |
| プライバシーポリシー | **未実装** | — | 同上 |
| ヘッダー文言 | **実装済** | `site.edit` → `header_text` | |
| ヘッダー右上リンク | **実装済** | `menu_label` + `menu_url` | 両方入力時のみ会員画面に表示 |
| テーマカラー | **実装済** | `site.edit` → `theme_color` | `#RRGGBB` |
| コースページ外観 | **実装済** | **ページ設定 → コースページ** | `course_page_settings` JSON・`dashboard_page_message` |
| ログインページ | **実装済** | **ページ設定 → ログインページ** | `login_page_message`・`login_page_settings` |
| レッスンページ共通 | **実装済** | **ページ設定 → レッスンページ** | `lesson_footer_message`・`lesson_page_settings` |
| 固定ページ | **実装済** | **ページ設定 → 固定ページ** | `membership_site_fixed_pages` |

### サイト名

- **利用箇所**: 管理画面、会員ログイン周辺、メール表記（連携実装時）
- **入力**: テキスト（必須）

### サイトURL

- **管理**: スラッグ編集は **サイト設定**、完成URLのコピーは **URL管理**
- **挙動**: `status=active` のときのみログインURLが有効

### ロゴ画像

- **形式**: jpg / png / gif / webp（5MB以下）
- **利用箇所**: 会員ヘッダー（ページ設定で表示 ON のとき）、ログインページ（ページ設定）

### 公開状態

| 値 | 挙動 |
|----|------|
| 公開（`active`） | 会員がログイン可能 |
| 下書き（`draft`） | 会員ログイン不可。管理者は編集可能 |

---

# 2. 決済連携設定

## 機能概要

商品購入時に、会員アカウント生成・**コースの結合**（またはコース単体の内部レコード）**付与**・案内メール等を行う連携。

**Monaka では「サイト設定」画面には含めません。** 初期設定と商品プランで管理します。

## 全体フロー（目標）

```text
商品購入
  ↓
決済成功（Webhook）
  ↓
会員サイト会員（site_members）生成
  ↓
コースの結合付与（member_bundle_grants）
  ↓
ログイン可能・マイページにコース表示
```

## 実装対応表（§2）

| 設計項目 | Monaka 状態 | 画面 / 保存先 | 備考 |
|----------|-------------|---------------|------|
| 決済連携 ON/OFF | **実装済**（接続単位） | `setting.payment` → `payment_gateway_accounts` | アカウント単位。サイト単位トグルはなし |
| 商品紐付け | **実装済** | `product.show` プラン一覧 | `products` / `product_plans` |
| コースの結合付与 | **実装済**（保存のみ） | プラン編集 → `after_purchase_bundle_id` → `course_bundles.id` | |
| 単体コース付与 | **手動は実装済** | 受講生管理 `grant_target=course:{id}` | 購入後のコース単体自動付与は未接続 |
| 決済成功時メール | **未実装**（会員サイト向け） | テレコム入金確定は `orders` のみ | |
| 初回ログインURL | **運用** | `site.url` で案内 | 自動メール組み込みは未実装 |
| 購入後遷移URL | **一部** | ファネル `form_payment` のリダイレクト・テレコム `redirect_url` | 商品単体サンクスはプラン次第 |
| 解約時制御 | **未実装** | 継続課金プランはデータ上あり | |
| 継続課金失敗時 | **未実装** | | |
| Webhook から会員作成・自動付与 | **未接続** | `OrderPaymentFulfillmentService` はログのみ | **最重要ギャップ** |

### 購入後開放の設定手順（現行）

1. **初期設定 → 決済連携** でテレコム / UnivaPay 等を登録
2. **初期設定 → 商品登録** で商品・プランを作成
3. プランで **決済連携** と **購入後に開放するコースの結合** を選択
4. 公開プランの **購入URL**（`/buy/{planUid}`）で決済テスト（入金確定まで）
5. 会員への反映は、現状 **受講生管理での手動付与** または今後の Webhook 実装待ち

### 注意（コースの結合未設定）

```text
ログインできる
  ↓
マイページが空（付与コースの結合に公開中コースが0件）
```

**原因**: コース未付与・コースの結合にコース未含有・プランの `after_purchase_bundle_id` 未設定。

---

# 3. コースカテゴリ設定

## 機能概要

コースをカテゴリで分類し、会員の **一覧・導線を整理** する機能（**権限とは無関係**）。

## Monaka 現状

| 設計項目 | 状態 | 備考 |
|----------|------|------|
| カテゴリ CRUD（名前・並び順） | **実装済** | `membership_sites.course_categories`（JSON）・**サイト設定** で追加/並べ替え/削除（最大50件） |
| コースへのカテゴリ紐付け | **実装済** | `course_settings.basic.course_category_id`（**コース基本設定** で選択） |
| 会員画面のカテゴリ別表示 | **一部** | マイページの **コースの結合で絞り込み** は従来どおり結合名。教材カテゴリの絞り込みは **コースの結合内コース一覧**（`?course_category=`）で、ページ設定の絞り込み表示が ON かつカテゴリ登録ありのとき |

### コースの結合との関係（再掲）

| 機能 | 役割 |
|------|------|
| コース | 実教材 |
| コースの結合 | 開放権限 |
| コースカテゴリ（本節・将来） | 表示整理 |

---

# 4. 会員サイト全体の推奨構造（Monaka）

```text
会員サイト（membership_sites）
 ├ サイト設定 / ページ設定 / URL管理
 ├ コース（bundle_courses）… 教材
 │    └ グループ（courses）→ レッスン（lessons）
 ├ コースの結合（course_bundles）… 任意・開放パック
 ├ 受講生（membership_site_members）+ 付与（member_bundle_grants）
 ├ 商品プラン（product_plans.after_purchase_bundle_id）… 購入後開放（保存済・自動化は未）
 └ 会員URL /member/{slug}/…
```

---

# 5. 実装ロードマップ（サイト設定周辺）

優先度はプロダクト判断。本書では設計と現状差分の整理のみ。

| 優先 | 項目 | 内容 |
|------|------|------|
| P0 | 購入後自動付与 | Webhook 確定時に `SiteMember` 作成 + `member_bundle_grants` |
| P1 | 会員サイト `target_type=site` 独自ドメイン | `setting.domain` と会員ログイン URL の統合 |
| P2 | コースカテゴリ拡張 | 親子階層・画像・マイページ直下の教材カテゴリ絞り込み（現状は JSON フラット＋結合内一覧） |
| P2 | SEO / OGP / favicon | サイトまたはページ単位 |
| P3 | 会員自己登録 ON/OFF | `site.edit` トグル |
| P3 | ログイン後 TOP 先指定 | ダッシュボード / 固定ページ / 指定レッスン |
| P3 | 解約・課金失敗時のアクセス制御 | 継続プラン連動 |

---

# 6. 関連ドキュメント

| パス | 内容 |
|------|------|
| `docs/funnel-spec.md` §10.1 | 会員サイト技術仕様・ルート・DB |
| `docs/manual.md` §会員サイト | 利用者向け手順 |
| `docs/funnel-spec.md` 決済・商品 | 決済連携・テレコム Webhook |
| `CLAUDE.md` | 実装ログ |

---

## 変更履歴

| 日付 | 内容 |
|------|------|
| 2026-05-27 | 初版。外部設計案を Monaka の画面・DB・実装済/未実装にマッピング。 |
| 2026-05-27 | **`site.edit` UI**: 3区分マップ・別画面カード・基本設定フォームの見出し分割・ログインURLプレビュー。 |
| 2026-05-27 | ユーザー向け表記を **「コースの結合」** に統一（旧「バンドルコース」廃止）。画面・メッセージ・マニュアル・仕様書を一括更新。 |
