# 予約枠を Supabase で読む（`/api/eap/reservation-config`）

従来は **`GET /api/eap/reservation-config`** が GAS の `action=reservationConfig` をプロキシしていました。**Supabase に巡回枠マスタを移したあと**は、同じエンドポイントが **DB（Postgres）から GAS 互換 JSON** を組み立てて返します。フロント（`yoyaku_employee.html`）の URL は変更不要です。

---

## 1. 環境変数（Vercel）

| 変数 | 説明 |
|------|------|
| `SUPABASE_URL` | 既存どおり |
| `SUPABASE_SERVICE_ROLE_KEY` | 既存どおり（**サーバのみ**。フロントに出さない） |
| `EAP_RESERVATION_CONFIG_SOURCE` | **`supabase`** … DB 読み固定。**`gas`** … GAS プロキシ固定。**未設定** … `SUPABASE_*` が揃っていれば Supabase、無ければ GAS |

本番で Sheet と DB を切り替えるときは、この値で明示すると安全です。

---

## 2. SQL の適用

1. **`docs/sql/07_visit_slots.sql`** … テーブル **`visit_slots`**（旧 `03_巡回枠`）作成と **COMMENT**。
2. （未実行なら）**`docs/sql/08_schema_comments_ja.sql`** … `tenants`・`reservations` など **01 で作った主要テーブル全体**の日本語 **COMMENT**。

Table Editor の **列名は英語のまま**にし、意味は **COMMENT** と運用メモで補うのが安全です。

既存の **`tenants`** を参照します（`tenant_id` で紐づけ）。企業側マスタは **`tenants.visit_plan`**・**`display_name`**・**`employee_count_ref`** を予約ロジックが読みます（列が無い場合はマイグレーション SQL で追加済みか確認してください）。

予約済み枠の判定には **`reservations`** の **`prefer1` / `prefer2` / `prefer3`**（日時文字列をパース）および **`appointment_kind`** を使います。**主要テーブルの日本語 COMMENT** は **`docs/sql/08_schema_comments_ja.sql`** で一括付与できます（`visit_slots` は **`07_visit_slots.sql`** 側）。

---

## 3. データ移行の目安

1. **`01_企業マスタ`** の **訪問プラン・表示名・従業員数_参考** を `tenants` の対応列へ反映。
2. **`03_巡回枠`** の各行を **`visit_slots`** に INSERT（`tenant_id` は `tenants.id` の UUID）。
3. ステージングで **`EAP_RESERVATION_CONFIG_SOURCE=supabase`** を付け、`/api/eap/reservation-config?tenant=…` の JSON が期待どおりか確認。
4. 問題なければ本番でも `supabase` に切り替え。

運用ドキュメントの Sheet 版は引き続き **`docs/reservation_slots_admin.md`** を参照し、列の意味は **`visit_slots`** の COMMENT と対応しています。

---

## 4. Supabase の画面で「日本語」にしたいとき

- **列名・テーブル名を日本語にする**のは SQL・ORM・API でトラブりやすいため推奨しません。
- **日本語の意味を残す**には、`07_visit_slots.sql` と同様に **`COMMENT ON`** を付けるのが標準です（設計書・後任への引き継ぎにも効きます）。
- Table Editor は環境によって説明表示が弱いことがあります。その場合は **SQL Editor** で `\d+ visit_slots` 相当の情報を確認するか、運営用に **スプレッドシートまたは Notion に対応表**を1枚置く運用も現実的です。

---

## 5. トラブルシュート

| 症状 | 確認 |
|------|------|
| 502 と「visit_slots が無い」旨 | `07_visit_slots.sql` 未実行またはスキーマ名の食い違い |
| `windows` が空 | `visit_slots` に **`visit_date` が当日以降（Asia/Tokyo）**かつ **`active=true`** の行があるか |
| まだ GAS に飛ぶ | `EAP_RESERVATION_CONFIG_SOURCE=gas` になっている、または `SUPABASE_*` が未設定 |

---

## 6. 関連ドキュメント（食い違いを防ぐ）

| 内容 | ファイル |
|------|-----------|
| 全体の索引 | `docs/DOCUMENT-INDEX-ja.md` |
| デプロイ・環境変数の概要 | ルート `README.md`、`.env.example` |
| Sheet の列の意味（運用の辞書） | `docs/reservation_slots_admin.md` |
| 移行フェーズ・RLS・API 契約の説明 | `docs/supabase-migration-procedure-ja.md` |
| 運営のチェックリスト・平日対応 | `docs/owner-runbook-ja.md` / `.html` |
| 匿名予約・dual_write・シート列 | `docs/privacy-data-minimization-ja.md` |

---

**改訂**: スキーマや列・環境変数を変えたら、**本ファイル**・**`docs/DOCUMENT-INDEX-ja.md`**・**`README.md`**・**オーナー手順書**・**移行手順書**のいずれかに必ず反映してください。
