# コード照合：クーポン・紹介の条件

確認版：`source-index.md` の F・B（2026-09-20）。原本p.54〜61と併用する。コード断片は P1〜P4。

## 誕生日クーポン

入口：「売上向上 → クーポン → 誕生日クーポン」。配布タイミング・送信時刻・期限・割引・利用先を設定し、「自動配信を有効にする」を確認して「誕生日クーポン設定を保存」。

| 質問 | 確認した条件 |
| --- | --- |
| 自動と手動は同じ対象か | 手動は送信時刻を待たず実行するが、誕生日と何日前に配布するかの条件は残る。7日前なら7日後が誕生日のお客様が対象。全顧客への送信ではない。 |
| 手動テストは自分だけに届くか | 自分専用のプレビューではない。「今日の対象者」へ実際にLINE配信する。同じお客様・同じ年にも新しいクーポンを再発行できる。 |
| OFFのまま試せるか | 設定がOFFなら処理をスキップし、画面にONで保存するよう表示する。手動配信は保存済み設定を使う。 |
| 対象0人になる | 配布日条件、生年月日、有効な顧客、LINE連携、同意を確認する。管理画面だけで作成したLINE未連携顧客は対象にならない。 |
| 発行数とLINE成功数が違う | クーポン発行とLINE送信は別処理。発行済みでも送信に失敗する場合がある。成功・失敗の内訳を確認し、手動実行を重ねて余分なクーポンを増やさない。 |
| 年1回だから連打しても同じか | 自動配信には年単位の重複防止があるが、手動テストには同じ制限を適用しない。 |

手動の入口は「今すぐ手動配信」。対象条件と実送信・再発行の影響を確認して、確認画面の「今すぐ配信する」。結果の対象人数・新規発行・LINE送信成功・失敗を確認する。このプラグインが配信を実行したとは言わない。

根拠：F `CouponManagementPanel.tsx` の手動配信処理、B `coupon_routes.py` の `run_birthday_coupon_now` → `BirthdayCouponService.run_due`。手動の引数は `force_time=True` と `allow_repeat_per_customer=True`。この意味を「対象条件を全解除する」と誤読しない。

## 友達紹介

入口：「売上向上 → 友達紹介」。被紹介者（紹介されたお客様）向けの登録特典と、紹介者向けの初回来店後特典を分ける。

- 自分自身への紹介は不可。
- 紹介された方に来店済み予約がある場合は、初回来店前の条件を満たさない。
- 紹介者と紹介された方の電話番号が同じ場合は登録不可になる。
- 同じ紹介の登録をもう一度行うことと、別の紹介者へ変更することは別。既に別の紹介者が登録されていれば拒否される。
- 紹介者特典の判定は、紹介された方の予約が「来店済み」になった処理で行う。予約作成だけ、予約日時の到来だけ、紹介者自身の来店だけを条件達成と扱わない。
- 紹介登録日より前の日付の予約や、初回ではない来店済み予約には対象外になる分岐がある。
- 発行済みでもLINEが失敗している場合がある。履歴で発行・送信を区別する。「届かないので紹介登録をやり直す」と即断しない。

根拠：B `referral_service.py` の紹介登録処理、`process_completed_reservation`、`issue_referrer_reward`。画面の特典名・割引・ON/OFFは固定値と決めつけず、対象店舗の設定を確認してもらう。
