Skip to content

クーポン発行機能

概要

店舗事業者がクーポンを作成・配布し、ユーザーが提示・消費する機能。 クーポンは消費されるまでユーザー間で受け渡しができる。


登場人物

役割できること
店舗事業者(org:owner)クーポン作成・ユーザーへの配布
ユーザークーポンの受け取り・提示・受け渡し
主催者 または 事業者クーポンの消費確認(OK 操作)

クーポンの種類

種別説明
discount_percentage割引率10% OFF
discount_amount固定割引額500円引き
free_item無料アイテムドリンク1杯無料

フロー

1. 作成(事業者)

  • 事業者がクーポンを作成する
  • 特定イベントに紐づけることができる(任意)
  • 紐づけたイベントのイベント画面に「利用可能クーポン」として表示される

2. 配布(事業者 → ユーザー)

  • 事業者が配布したいユーザーを画面から選択して送信する
  • 受け取ったユーザーの所持クーポン一覧に表示される

3. 受け渡し(ユーザー → ユーザー)

  • 所持クーポン画面から渡したい相手のユーザーを選択して確定する
  • 確定と同時に current_holder_id が変わる
  • 受け取り側への通知あり。拒否機能は初期実装では持たない

4. 提示・消費

  • ユーザーが所持クーポン画面を相手(主催者 or 事業者)に見せる
  • 相手が確認して「OK」操作をする → status: 'used' に変わる
  • 消費後は受け渡し・再利用不可

表示ルール

画面表示内容
所持クーポン一覧current_holder_id = 自分 かつ status: 'active' のクーポン
イベント画面event_id = そのイベント かつ自分が所持している active なクーポン

データ設計

coupons(クーポン定義)

カラム備考
org_id必須(将来 nullable)作成した店舗。イベンター対応時に nullable 化
created_byusers.id作成したユーザー
event_id任意紐づけるイベント
typeenumdiscount_percentage / discount_amount / free_item
valuenumber割引率・割引額・無料アイテム数
descriptiontext例: ドリンク1杯無料
max_issuance任意発行上限枚数。未設定は上限なし
expires_at必須有効期限

user_coupons(クーポン所持)

カラム備考
coupon_idcoupons.id
issued_to_idusers.id最初の受取人(変わらない)
current_holder_idusers.id現在の所持者(受け渡しで変わる)
tokenUUIDQR コード対応用。encode するだけで QR 化できる
statusenumactive / used / expired
used_at任意消費日時
used_by_id任意消費を確認したユーザー(主催者 or 事業者)

ビジネスルール

  • status: 'used' または 'expired' のクーポンは受け渡し・消費不可
  • 有効期限(expires_at)を過ぎたクーポンは表示時に expired として扱う(cron 不要・時刻導出)
  • 消費操作は主催者または事業者のみ実行可能
  • クーポンの消費は audit_logs に記録する
  • issued_to_id は変更不可(誰に最初に配布されたかの履歴)

将来対応

対応必要な変更
QR コードで提示・受け渡しtoken を QR encode するだけ(スキーマ変更なし)
イベンターもクーポン作成可能org_id を nullable に変更 + event_id を活用
受け渡し時の受諾確認user_couponsstatus: 'pending_transfer' を追加

クリップボードコピー

  • 所持クーポン画面で、クーポンの説明・利用条件をクリップボードにコピーできる(相手に内容を伝えやすくする用途)

TBD

  • なし