# 予約枠の管理（`03_巡回枠` ＋ 企業マスタ「訪問プラン」）

従業員向け **`yoyaku_employee.html`** は、**`GET /api/eap/reservation-config`** で **訪問プラン・会社名**などを取得します。**Supabase 経路**では DB から組み立て、**GAS 経路**では `action=reservationConfig` をプロキシします。切り替えは環境変数（詳細は **`docs/reservation-supabase-ja.md`**）。

**現行の予約入力 UI（匿名 ID 方式）**では、利用者は **カレンダーで希望日** と **午前／午後／夕方** を選びます。**細かい開始時刻のコンボ（03_巡回枠から生成したリスト）は使いません**。巡回枠は **運営・カウンセラー側が「いつ現場に行けるか」を把握するマスタ**として引き続き意味があります。

---

## 1. 企業マスタ `01_企業マスタ`（末尾列）

| 列名 | 内容 |
|------|------|
| **訪問プラン**（最右列） | `none` … 訪問予約なし（画面は案内のみ）。<br>`monthly_1` … 月1回ライト相当。<br>`monthly_2` … 月2回スタンダード相当。<br>空欄は **`monthly_1` と同じ扱い**。 |

**従業員数_参考（G列）** … 相談枠数の自動計算に使用（公開料金の区分に合わせる）。

- 10名以下 → 相談枠 **1**（50分）
- 11〜20名 → **2**
- 21〜30名 → **3**
- 31名以上 → **手動**（`03_巡回枠` の `consultSlotsOffered` に数値を必ず入れる）

---

## 2. 巡回枠シート `03_巡回枠`（1行＝1訪問日の窓）

| 列 | 説明 |
|----|------|
| slotRowKey | 任意の識別子（空なら自動生成風のキーをサーバ側で扱う）。 |
| tenantId | 企業コード（`01` の A列と一致）。 |
| officeId | 事業所専用枠なら `02` の A列。**全社共通なら空欄**。 |
| visitDate | 訪問日 `yyyy-MM-dd`（当日より前は無視）。 |
| windowStart / windowEnd | 受付窓 `HH:mm`（例 9:00〜12:00）。 |
| slotStepMin | 何分刻みで開始時刻を並べるか（未設定・0なら15）。 |
| consultSlotMin | 相談1枠の長さ（分）。未設定なら50。 |
| consultSlotsOffered | **その日の相談枠の上限本数**。空なら従業員数から自動。0で相談枠なし。 |
| hrSlotMin | 人事・事業主面談の長さ（分）。未設定なら30。 |
| hrSlotsOffered | **その日の面談枠の上限本数**。空は **0扱い（面談枠なし）**。面談を出すときは `1` など。 |
| active | `TRUE` / 空 ＝有効。`FALSE` 等で無効。 |
| メモ | 自由記述。 |

**運用のコツ**

- 月1回契約なら、月ごとに **1行追加**（訪問日を更新）。
- 月2回なら **同月に2行**（別日）。
- 公開サイトの料金どおりの枠数にしたいときは **`consultSlotsOffered` を明示**すると確実です。

---

## 3. 初回セットアップ

1. GAS エディタで **`runEapWorkbookSetup`** を実行（タブ `03_巡回枠` が無ければ作成・並び替え）。
2. `01_企業マスタ` の **訪問プラン** を入力。
3. `03_巡回枠` に、受付したい行を追加。
4. ウェブアプリを**再デプロイ**（`doGet` / `doPost` の変更反映）。

---

## 4. 予約一覧シートの列（参照）

- **予約区分** … 従来どおり `consult`（50分相談）または `hr_meeting`（人事等30分）で **GAS 経由の細かい枠予約**をした場合。<br>**匿名 ID・日付・時間帯だけの予約**では **`anonymous_band`** が入ります。
- **visitSlotRowKey** … 細かい枠予約時にフロントから渡した枠行キー。**匿名予約では空**になります。

匿名予約時の列の意味の詳細は **`docs/privacy-data-minimization-ja.md` §2** を参照してください。

---

## 5. `dual_write` でシートに予約行が残るとき（運営向け）

| 確認すること | 理由 |
|--------------|------|
| シートの **共有範囲** | 匿名 ID でも、閲覧者が多すぎると運用リスクが上がる。 |
| **`RESERVATION_NOTIFY_EMAIL`** | 匿名予約のメール本文は **ID と希望日時のみ** の設計。 |
| Supabase の **`anonymous_id`** | `docs/sql/06_reservations_anonymous_id.sql` を未実行だと INSERT エラーになる。 |

---

---

## 6. Supabase を予約枠のマスタにする場合（本番推奨の構成）

スプレッドシートの **同名の概念**（訪問プラン・従業員数参照・巡回枠の列）は、DB では次に対応します。

| Sheet（本書 §1〜2） | Supabase |
|---------------------|----------|
| `01_企業マスタ` の訪問プラン・表示名・従業員数_参考 | `tenants.visit_plan`, `display_name`, `employee_count_ref` |
| `03_巡回枠` の各行 | `visit_slots`（**`docs/sql/07_visit_slots.sql`** で作成） |

- **API**: `GET /api/eap/reservation-config` が **GAS 互換 JSON** を返す（実装は `api/eap/reservation-config.js`）。  
- **環境変数**: **`EAP_RESERVATION_CONFIG_SOURCE`** と **`SUPABASE_*`**（詳細・検証手順は **`docs/reservation-supabase-ja.md`**）。  
- **日本語の列説明**: Table Editor の列名は英語のままにし、**`COMMENT ON`** で意味を残す（巡回枠は `07`、他テーブルは **`docs/sql/08_schema_comments_ja.sql`**）。

Sheet を運用の参照用に残す場合でも、**表示や API が読む正は DB** にそろえているかを運営で確認してください。

---

**改訂**: 画面の入力方式が変わったら、本ファイルと **`docs/privacy-data-minimization-ja.md`**・**`docs/reservation-supabase-ja.md`** を揃えて更新してください。
