# 🧪 軽量電子カルテ サーバー同期 — テストガイド

## 📌 概要

この文書は、`dashboard-backend.gs` を Apps Script にデプロイした後、
ダッシュボードとの連携が正しく動作するかを検証するためのテスト手順です。

**対象機能**:
- ✅ スタッフメモ（`Karte_Memos` シート）
- ✅ 永続フラグ（`Karte_Flags` シート）
- ✅ 施術記録（`Karte_VisitRecords` シート）
- ✅ リピーター管理（`Karte_Repeaters` シート）

---

## 🛠 事前準備

### 1. Apps Script デプロイ確認

- [ ] `dashboard-backend.gs` が Apps Script にアップロード済み
- [ ] `SPREADSHEET_ID` が正しいスプレッドシート ID に変更済み
- [ ] 「デプロイ → 新しいデプロイ → ウェブアプリ」実行済み
- [ ] 「アクセスできるユーザー: 全員」設定済み
- [ ] 発行された Web App URL を控えている

### 2. ダッシュボード config.js 更新

```js
// dashboard/config.js
window.DASHBOARD_CONFIG = {
  brand: { name: 'CORAN BANGKOK' },
  submission: {
    webAppUrl: 'https://script.google.com/macros/s/AKfyc.../exec'  // 貼り付け
  },
  auth: { password: 'your_password' }
};
```

### 3. テスト環境準備

- [ ] Chrome ブラウザを2つ開く（メイン + シークレット）
- [ ] スプレッドシートを別タブで開いておく
- [ ] デベロッパーツール（F12）を開いてコンソールを表示

---

## 🧪 テストケース

### TC-01: 初回ロード時のデータ同期

**目的**: Apps Script からダッシュボードへのデータ取得が動作するか確認

**手順**:

1. スプレッドシートの `Karte_Memos` シートに手動でテストデータ1行追加:
   ```
   name               | text                    | updatedAt
   テスト太郎         | テストメモ内容          | 2026-04-24T10:00:00Z
   ```

2. ダッシュボードをブラウザで開く

3. コンソールを確認

**期待結果**:
- [ ] コンソールに `Karte data loaded from server` のログ出力
- [ ] エラーが出ていない

4. ダッシュボードでテスト太郎を選択

5. スタッフメモカードを確認

**期待結果**:
- [ ] メモ内容「テストメモ内容」が表示される
- [ ] 最終更新日時が `2026/4/24 19:00:00` 形式で表示される

---

### TC-02: スタッフメモの保存

**目的**: ブラウザからサーバーへの書き込みが動作するか確認

**手順**:

1. 任意のお客様を選択

2. スタッフメモに以下を入力:
   ```
   前回施術で首の張り強め。ラベンダーオイル使用で落ち着いた。
   ```

3. 💾 保存ボタンをクリック

4. ボタンが緑色 `✓ 保存しました` に変化するのを確認

**期待結果**:
- [ ] ブラウザ上で保存成功の表示
- [ ] コンソールに sync エラーなし

5. スプレッドシートの `Karte_Memos` シートを開き、リロード

**期待結果**:
- [ ] 該当お客様名のメモ行が追加されている（または既存行が更新）
- [ ] `updatedAt` が現在時刻の ISO 形式

---

### TC-03: 永続フラグの追加・削除

**手順**:

1. 任意のお客様を選択

2. `⚠️ PERSISTENT ALERTS` カードの `+ 追加` をクリック

3. プロンプトに以下を入力:
   ```
   ラベンダーアレルギー
   ```

4. OK をクリック

**期待結果**:
- [ ] フラグチップ「🚩 ラベンダーアレルギー ×」が表示される

5. スプレッドシートの `Karte_Flags` シートをリロード

**期待結果**:
- [ ] 新しい行が追加されている
  ```
  name         | flag                   | addedAt
  お客様名     | ラベンダーアレルギー   | 2026-04-24T...
  ```

6. ダッシュボードに戻り、フラグの `×` をクリック

7. スプレッドシートをリロード

**期待結果**:
- [ ] 該当行が削除されている

---

### TC-04: 施術記録の追加・削除

**手順**:

1. 任意のお客様を選択

2. `📅 TREATMENT RECORDS` の `+ 記録を追加` クリック

3. フォームに以下を入力:
   - 日付: 2026-04-20
   - 施術内容: アロマ60分
   - 担当: 佐藤
   - 所要時間: 60
   - 所見: 強さ2/5、ラベンダーオイル使用

4. 保存クリック

**期待結果**:
- [ ] 施術記録カードに新しい記録が表示
- [ ] スプレッドシートの `Karte_VisitRecords` に行追加

5. 記録の `×` クリック → 削除確認OK

**期待結果**:
- [ ] カードから消える
- [ ] スプレッドシートからも削除

---

### TC-05: 複数端末間でのデータ共有

**目的**: 別ブラウザ/端末でも同じデータが見えるか確認

**手順**:

1. メインブラウザでテスト太郎にスタッフメモ `メモA` を保存

2. シークレットウィンドウでダッシュボード URL を開く

3. ログイン → テスト太郎を選択

**期待結果**:
- [ ] シークレットウィンドウ側でも `メモA` が表示される
- [ ] （localStorage は別なので、サーバーから取得できている証拠）

---

### TC-06: ネットワーク障害時のフォールバック

**目的**: オフラインでも動作するか確認

**手順**:

1. ブラウザのデベロッパーツール > Network タブ

2. Throttling を「Offline」に変更

3. 任意のお客様に新しいフラグを追加

**期待結果**:
- [ ] ブラウザ上では追加が反映される（localStorage に保存）
- [ ] コンソールに `Karte sync failed (addFlag): ...` エラー（想定内）

4. Offline を解除（Online に戻す）

**期待結果**:
- [ ] 既存のデータは引き続き表示される

**⚠️ 注意**: 現在の実装ではオフライン中の変更は再接続時に自動同期しません。
必要に応じて再度入力が必要です（将来的な拡張ポイント）。

---

### TC-07: リピーター管理の同期

**手順**:

1. 任意のお客様にリピーター登録

2. スプレッドシートの `Karte_Repeaters` シートを確認

**期待結果**:
- [ ] お客様名が追加されている

3. リピーター解除

**期待結果**:
- [ ] 該当行が削除される

---

## 📊 テスト結果レポート（テンプレート）

```
テスト実施日: 2026-__-__
実施者: __________
Apps Script URL: https://script.google.com/macros/s/.../exec

| TC ID | 内容                     | 結果 | 備考          |
|-------|------------------------|------|--------------|
| TC-01 | 初回ロード同期           | ✅/❌ |              |
| TC-02 | メモ保存                | ✅/❌ |              |
| TC-03 | フラグ追加・削除         | ✅/❌ |              |
| TC-04 | 施術記録追加・削除       | ✅/❌ |              |
| TC-05 | 複数端末間同期          | ✅/❌ |              |
| TC-06 | オフライン動作          | ✅/❌ |              |
| TC-07 | リピーター同期          | ✅/❌ |              |

全ケースパス: ⬜ はい ⬜ いいえ

発見された不具合:
_______________________________________

本番稼働承認: ⬜ 承認 ⬜ 修正必要
```

---

## 🚨 トラブルシューティング

### 問題1: `Karte data loaded from server` が出ない

**原因と対処**:
- `webAppUrl` が config.js に設定されていない → 設定する
- URL が間違っている → Apps Script のデプロイURLを再確認
- Apps Script のアクセス権限が「自分のみ」になっている → 「全員」に変更して再デプロイ

### 問題2: CORS エラーが出る

**原因と対処**:
- Apps Script の Web App URL が `/exec` で終わっていない → `/exec` まで含めた URL に修正
- ブラウザのキャッシュ → Ctrl+Shift+R でハードリロード

### 問題3: スプレッドシートにデータが追加されない

**原因と対処**:
- `SPREADSHEET_ID` が間違っている → 正しい ID に修正して Apps Script を再デプロイ
- シートへの書き込み権限がない → Apps Script 実行時の承認をやり直す
- スプレッドシートが削除された → 新規作成して ID を更新

### 問題4: シートが自動作成されない

**原因と対処**:
- `SPREADSHEET_ID` のスプレッドシートに対するアクセス権限不足 → オーナー権限で Apps Script を実行
- 手動で3シート（Karte_Memos / Karte_Flags / Karte_VisitRecords）を作成

---

## 📝 デプロイ後の管理

### バージョン管理

Apps Script のデプロイ画面で:
- 「デプロイを管理」→「編集（鉛筆アイコン）」→「新しいバージョン」で更新

### ログ確認

```
Apps Script エディタ → 表示 → 実行数
```

エラー発生時はここでスタックトレースを確認できます。

### 定期メンテナンス

- **月1回**: スプレッドシート容量確認（Karte_VisitRecords が肥大化しがち）
- **四半期**: Apps Script クォータ消費状況確認
- **年1回**: Apps Script アクセス権限の見直し

---

## 🔐 セキュリティチェックリスト

- [ ] `SPREADSHEET_ID` がコードに直書きされているので、GitHub 等の公開リポジトリにコミットしない
- [ ] 本番用スプレッドシートには顧客情報が入るので、Google アカウント自体のセキュリティ設定を厳格化（2段階認証必須）
- [ ] ダッシュボードのパスワードは3ヶ月ごとに変更を推奨
- [ ] 退職スタッフが出た際、速やかにアクセス権を剥奪
