# リピット (e_repeat) → Beene業務ポータル 取り込み手順

リピット管理画面からCSVをエクスポートし、業務ポータルの `data/imports/*.json` を更新する。
取り込み済みJSONがあれば各ページがそれを優先表示し、無ければ `data/mock/*.json` にフォールバック（UIが壊れない設計）。

## 1. リピット側でエクスポート

リピット管理画面（hot-yoyaku.net 系サブドメイン）にログインし、以下を出力してこのフォルダ（`data/import/repeat/`）に保存する。**全店舗合算で1ファイルずつでOK**（CSV内の店舗カラムで自動振り分け）。

| ファイル名 | リピットメニュー想定 | 必須 |
|---|---|---|
| `customers.csv` | 顧客一覧／会員CSV出力 | ★ |
| `appointments.csv` | 予約台帳／予約履歴 | ★ |
| `treatments.csv` | 施術履歴／来店履歴 |  |
| `subscriptions.csv` | サブスク・コース契約 | ★ |
| `tickets.csv` | 回数券残数 | ★ |
| `sales.csv` | 売上明細 |  |
| `cancel_waits.csv` | キャンセル待ち |  |
| `karte.csv` | カルテ／施術記録 |  |

文字コード・ヘッダー名はリピットのまま（編集不要）。スクリプト側で UTF-8 / SJIS 自動判定、日本語ヘッダー揺れ吸収。

## 2. 取り込みコマンド

```bash
cd /Users/yutasasaki/beene-gyomu-portal
python3 data/import/repeat/import.py            # 全種類
python3 data/import/repeat/import.py --type customers
python3 data/import/repeat/import.py --dry-run  # 出力せず構造のみ確認
```

出力先: `data/imports/{customers,appointments,...}.json`
（このディレクトリにJSONがあれば各ページが自動で優先取り込み）

## 3. ローカル確認

```bash
cd /Users/yutasasaki/beene-gyomu-portal
python3 -m http.server 8765
# → http://localhost:8765/customers.html などで実データ表示を確認
```

## 4. 本番反映

問題なければ Cloudflare Pages へ再デプロイ：

```bash
cd /Users/yutasasaki/beene-gyomu-portal
npx wrangler@latest pages deploy . --project-name=beene-gyomu-portal --branch=main --commit-dirty=true
```

## カラム名の揺れに対応する仕組み

`import.py` の `COLUMN_ALIASES` に各エンティティの想定カラム名候補を記載。
リピットの実ヘッダーを確認したら、候補を追記してメンテすれば対応できる。

例（顧客マスタ）:
```python
"customers": {
    "name": ["氏名", "お名前", "顧客名", "name"],
    "phone": ["電話番号", "携帯電話", "TEL", "電話", "phone"],
    ...
}
```

## 店舗ID解決

`STORE_ALIASES` で「Beene渋谷」「横手店」「秋田」等の表記揺れを `data/schema/stores.json` の正規 store_id に変換。
新店舗追加時は `STORE_ALIASES` と `data/schema/stores.json` の両方を更新。

## トラブル対応

- **「未配置」と出る** → ファイル名を確認（`customers.csv` の小文字、`.csv` 拡張子）
- **カラムがマッピングされない** → `_raw` キーに元データが残るので、JSONを開いて列名を確認し `COLUMN_ALIASES` に追加
- **店舗が `null` になる** → `STORE_ALIASES` のキーに該当する文字列が CSV の店舗カラムに含まれているか確認
- **文字化け** → スクリプトは utf-8-sig → utf-8 → cp932 の順に試行。それでもダメな場合はエクセルで開いて UTF-8 CSV として保存し直す

## 設計メモ

- `data/imports/` 配下のJSONはリピット出力の鏡像（再生成可能）。**手で編集しない**
- 顧客の`primary_store_id`がnullのレコードは、リピット側の店舗カラム表記がエイリアスに無いケース。一覧画面で目立つようにすると良い
- 既存の `data/mock/` は残置。実データ無い時の表示用
