<!-- https://unlockos.io/ja/manual/blacklist -->

# ブラックリスト管理

## 概要

ブラックリスト機能では、問題のあるゲストやメンバーの入場を施設レベルまたは組織全体でブロックできます。会員管理（/membership）とは独立した専用ページ（**メンバー一覧 → ブラックリストタブ**）で管理します。

登録方法は 4 種類あります。会員サブスクリプションの失効に伴う自動登録（membership）、予約キャンセル時（reservation）、チェックイン操作時（checkin）、そして施設オーナーまたは組織オーナーが手動で追加（manual）する方法です。

---

## 詳細機能

## 機能1: ブラックリストの確認

メニューの **メンバー** → **ブラックリスト** タブを開くと、組織内のアクティブなブラックリストエントリが一覧表示されます。

### 表示される情報

各エントリにはゲストのアイデンティティ情報（氏名・メールアドレス・電話番号・国籍）とともに、以下のバッジが表示されます。

| バッジ | 説明 |
|--------|------|
| **登録元（source）** | membership / reservation / checkin / manual |
| **スコープ** | 組織全体 / 施設のみ |
| **登録日** | ブロックされた日付 |

エントリをクリックするとメンバー詳細ページへ遷移します（ゲストプロフィールが紐付いている場合のみ）。

### 表示されるエントリの範囲

| ロール | 表示範囲 |
|--------|---------|
| Organization Owner | 組織内のすべてのエントリ |
| Facility Owner | 自施設のエントリ + 組織スコープのエントリ |

## 機能2: 手動でブラックリストに追加

施設オーナー・組織オーナーは「手動で追加」ボタンから任意のゲストをブラックリストに追加できます。

### 入力項目

| 項目 | 必須 | 説明 |
|------|------|------|
| **メールアドレス** | ○ | ブロック対象のメールアドレス。登録済みのゲストプロフィールと照合されます |
| **スコープ** | ○ | 組織全体（デフォルト）または施設のみ |
| **理由** | 任意 | 内部メモ。ゲストには表示されません |

#### スコープの違い

| スコープ | 効果 |
|---------|------|
| **組織全体** | 組織配下のすべての施設でブロック。`facility_id` は NULL として保存されます |
| **施設のみ** | 現在の施設のみでブロック。他施設には影響しません |

> ヒント: 組織全体スコープを選ぶと、同一メールアドレスのゲストが別施設を訪問しようとした際にも自動でブロックされます。

### 手順

1. メニューの **メンバー** → **ブラックリスト** タブを開く
2. 右上の「**手動で追加**」ボタンをクリック
3. メールアドレス・スコープ・理由を入力する
4. 「**追加**」ボタンをクリックして保存する

## 機能3: ブラックリストの解除

各エントリのカード右下にある「**解除**」ボタンをクリックし、確認ダイアログで「**解除**」を選択すると、そのエントリを無効化（`is_active = false`）できます。

解除後もエントリはデータベースに残り、監査ログで参照できます。再びブロックしたい場合は新規追加が必要です。

## 機能4: 会員サブスクリプション経由での自動登録

会員管理ページからメンバーを「ブラックリスト登録」すると、以下が自動的に行われます。

1. Stripe サブスクリプションのキャンセル（失敗しても ban は実行されます）
2. サブスクリプションのステータスを `revoked` に更新
3. `role_members` および `facility_members` からの除名
4. ブラックリストエントリの作成（source: `membership`）

Stripe のキャンセルに失敗した場合でも ban は有効になりますが、管理者に Stripe 側での手動調整を促す警告が表示されます。

---

## スコープと user_id の仕様

### user_id が NULL のエントリ（メールアドレスのみ）

ゲストがまだアカウント登録していない場合でも、メールアドレスだけでブラックリストに追加できます。この場合 `user_id` は NULL として保存されますが、チェックイン時のメール照合は引き続き有効です。

### 組織スコープのルール

`scope = 'organization'` のエントリは `facility_id` が **必ず NULL** になります。これはシステム側で自動的に強制され、特定の施設 ID が誤ってセットされることを防ぎます（migration `20260519150000` で制約追加済み）。

---

## よくある質問

### Q: ブラックリストに登録されたゲストはチェックインできますか？

登録されたメールアドレスまたはユーザー ID が一致するゲストは、チェックイン操作時にブロックされます。スコープが「組織全体」の場合は組織内のすべての施設で有効です。

### Q: ゲストはブラックリストに登録されたことを通知されますか？

現在、ゲストへの通知機能はありません。ゲストはチェックイン時に入場を拒否されます。

### Q: Facility Owner は他の施設のエントリを見られますか？

見られません。Facility Owner は自施設のエントリと組織スコープのエントリのみ参照できます。

### Q: 解除したエントリは復活できますか？

エントリは無効化されますが削除はされません。同じメールアドレスで再度手動追加を行うと、新しいエントリが作成されます。

---

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

### エントリを追加したのに表示されない

- 「組織全体」スコープで追加した場合、施設 ID は NULL になります。他施設から同じ組織スコープのエントリを参照している場合は正しく表示されます
- ページを再読み込みしてリストを更新してください

### 解除しても入場をブロックされる

- 同一メールアドレスの別のアクティブなエントリが存在していないか確認してください（「組織全体」と「施設のみ」の両方が登録されているケースがあります）

---

## 関連ページ

- [メンバーシッププランと会員管理](membership-plans.md)
- [チェックイン一覧](checkin-list.md)
