# 卸キーコード発行システム セットアップ手順

代理店（オフィスバスターズ等）が **代理店ID＋パスワード** でログインし、卸キーコードを
即時発行するシステム。2026-07-07 商談動画の要件に基づく実装。

## 概要・機能

1. **発行フォーム** … 商品（種別）・数量・販売先会社名・通知先メールを入力し即時発行。
   発行キーコードはCSVで通知先へ自動送信。
2. **マイページ** … 発行履歴・満期日の一覧、会社名/商品での絞り込み、CSVダウンロード。
3. **期限通知バッチ** … 満期90日前を代理店の通知先メールへCSVで日次通知。

認証は既存の「パートナーログイン」（`media.med_id` = 代理店ID / `media.med_pw` = パスワード、
ログイン失敗ロック付き）を再利用します。

## URL（本番反映後）

| 画面 | URL |
|------|-----|
| ログイン | `https://opcon.jp/agent/login.php` |
| 発行フォーム | `https://opcon.jp/agent/oroshi_index.php` |
| マイページ（履歴・期限） | `https://opcon.jp/agent/oroshi_mypage.php` |

未ログイン時は自動的にログイン画面へ遷移します。

## 1. DBセットアップ

本番DBに以下を適用します（`IF NOT EXISTS` により冪等）。

```bash
psql -U purabura -d payment-system \
  -f src/release/wholesale_keycode/dbsetting/01_wholesale_keycode_tables_create.sql
```

追加されるもの:

- `licence_types.valid_days`（商品種別ごとの有効日数。満期日算出に使用）
- `wholesale_keycode_issues`（発行: 会社名・種別・数量・発行日・満期日・通知先）
- `wholesale_keycode_issue_details`（発行明細: 個々のキーコード）
- `wholesale_keycode_expiry_notices`（期限通知の送信ログ）

## 2. 商品種別（licence_types）の設定

発行フォームの「商品」プルダウンには、**当該代理店に紐づく種別**が表示されます。

- `licence_types.report_med_no` = 対象代理店の `med_no` を設定
- `licence_types.valid_days` = 有効日数（例: 月額版=30 / 1年版=365 / 2年版=730。無期限はNULL）

```sql
-- 例: 代理店 med_no=21 向けに 1年版(licence_type_no=10) を有効365日で設定
UPDATE licence_types SET report_med_no = 21, valid_days = 365 WHERE licence_type_no = 10;
```

キーコード在庫は既存どおり `licences`（`licence_type_cd` = `licence_type_no`、
`mem_no IS NULL` = 未発行）に投入しておきます。発行時に在庫から
`FOR UPDATE SKIP LOCKED` で確保するため、同時発行でも二重発行しません。

## 3. 期限通知バッチ（cron）

`src/settings/cron.txt` に追記済み。VMの crontab へ反映してください。

```
# 卸キーコード 期限通知バッチ（毎日9:05）
5 9 * * * /usr/local/bin/php -q /home/ranet.payment.micup.jp/dat/batch/wholesale_keycode_expiry_notice.php
```

- 満期日が「本日 < expiry_date <= 本日 + 90日」で通知先があり、未通知のものを対象に、
  `(代理店, 通知先メール)` 単位で1通にまとめCSV添付で送信します。
- `wholesale_keycode_expiry_notices` で重複送信を防止（同一発行×90日しきい値は1回）。
- メール不達に備え、月2回以上（別時刻）の実行を推奨します。

手動実行:

```bash
php -q src/dat/batch/wholesale_keycode_expiry_notice.php
```

## 満期日の考え方

卸のため実際のアクティベート日は当社では分かりません。満期の起点は
**発行日（納品日）** とし、`満期日 = 発行日 + valid_days` で算出します
（実利用開始とはズレが生じ得る旨、代理店へ周知してください）。

## テスト

```bash
composer install
php vendor/bin/phpunit tests/Unit/WholesaleKeycodeFunctionTest.php
```
