テーマ
Requirements: 投票フロー
概要
候補者詳細画面における投票ロジックの仕様。無料投票の制約・有料投票の流れ・認証連携を定義する。
本仕様は機能ロジック中心のため、ビジュアル仕様は持たず、画面UIは
candidate-detail/ui-design.mdを参照する。技術設計(型定義・実装詳細)はdesign.mdを参照。
機能仕様
Feature 1: 無料投票ルール
Purpose: 同一ユーザーが1日1票だけ無料投票できる権利を保証し、金銭的負担なしの定期的な応援を成立させる。 Scope: 候補者詳細画面から呼び出される投票サービス。
Acceptance Criteria (EARS)
- THE SYSTEM SHALL 同一ユーザーの無料投票を1日1票に制限する
- THE SYSTEM SHALL 「日」の境界は 0:00:00 とする
- WHEN ユーザーが当日まだ無料投票していない THEN システムは無料投票を受け付ける
- WHEN ユーザーが当日すでに無料投票した THEN システムは無料投票を受け付けない
- WHEN 日付が変わった(0:00:00を跨いだ) THEN システムは再び無料投票を受け付ける
Feature 2: 残り時間の提示
Purpose: 当日無料投票が不可なユーザーに対し、次の無料投票が可能になるまでの残り時間を可視化する。 Scope: 投票アクションUIに併記する補助表示。
Acceptance Criteria (EARS)
- WHEN 当日無料投票が不可 THEN システムは翌日 0:00 までの残り時間を「N時間M分」形式で算出して提示する
- THE SYSTEM SHALL 残り時間は時間と分の単位(秒・ミリ秒は切り捨て)で表現する
- WHEN 当日無料投票が可能 THEN システムは残り時間を提示しない
Feature 3: 有料投票(投票券消費)
Purpose: 投票券残数を消費して有料投票を成立させ、強い応援意思を順位に反映できるようにする。 Scope: 投票券残数を保有するユーザー単位の投票サービス。
Acceptance Criteria (EARS)
- THE SYSTEM SHALL ユーザーごとの投票券残数を保持する
- WHEN ユーザーが投票券を購入した THEN システムは購入数量を投票券残数に加算する
- WHEN ユーザーが有料投票を実行した AND 投票券残数が1以上 THEN システムは1票分の投票券を消費して投票を成立させる
- WHEN ユーザーが有料投票を実行した AND 投票券残数が0 THEN システムは投票を成立させない
Feature 4: 認証連携(保留投票の継続)
Purpose: 未認証ユーザーが投票アクションを起点に認証を完了したとき、操作を中断させずに元のフローに復帰させる。 Scope: 投票アクションとログインモーダルを跨ぐ保留状態の管理。
Acceptance Criteria (EARS)
- WHEN 未認証ユーザーが投票アクションを実行しようとした THEN システムはログインモーダルを開き、保留中の投票種別(無料/有料)と対象候補者を保持する
- WHEN 認証が成功した AND 保留中の投票種別が「無料」 THEN システムは保持していた候補者へ無料投票を即時実行する
- WHEN 認証が成功した AND 保留中の投票種別が「有料」 THEN システムは投票券購入モーダルへ遷移し、購入フローを継続する
- WHEN ユーザーがログインモーダルを閉じた THEN システムは保留中の投票種別と選択中候補者をリセットする
Feature 5: 投票アクションのラベル
Purpose: 投票アクションUIのラベルと有効/無効状態を、ユーザーの投票可否に応じて一貫した文言に正規化する。 Scope: 候補者詳細画面の投票アクション。
Acceptance Criteria (EARS)
- WHEN 無料投票が利用可能 THEN システムは無料投票アクションのラベルを「無料で投票する(一日一回)」とする
- WHEN 無料投票が当日不可 AND 残り時間が取得できる THEN システムは無料投票アクションを無効化し、ラベルを「投票済み(あとN時間M分で再投票可能)」とする
- WHEN 無料投票が当日不可 AND 残り時間が取得できない THEN システムは無料投票アクションを無効化し、ラベルを「投票済み」とする
- THE SYSTEM SHALL 無効化されたアクションは支援技術にも無効状態を伝達する
- WHEN 有料投票が利用可能 THEN システムは有料投票アクションのラベルを「投票券を購入して投票する」とする
Feature 6: 投票成功時のフィードバック
Purpose: 投票成立をユーザーが視覚的に確認でき、得票数の更新と選択状態のリセットを一貫した手順で行う。 Scope: 無料/有料いずれの投票成功時にも適用される共通動作。
Acceptance Criteria (EARS)
- WHEN 投票(無料/有料)が成功した THEN システムはユーザーに視覚的な成功フィードバックを一定時間提示する
- THE SYSTEM SHALL 該当候補者の得票数を加算する(無料 = +1、有料 = 購入クレジット数)
- WHEN フィードバック表示が終了した THEN システムは選択中候補者をリセットする
Feature 7: 二重送信の防止
Purpose: ユーザーの連続操作による多重投票を防ぐ。 Scope: 投票アクション全般。
Acceptance Criteria (EARS)
- WHEN ユーザーが投票アクションを連続実行しようとした THEN システムは進行中の投票が完了するまで追加のアクションを受け付けない
非機能要件
- トランザクション: 有料投票時の投票券消費と得票数加算は原子性を保つ(同一トランザクション内で実施)
セキュリティ(時刻同期・サーバー側判定・重複防止・レート制限等)は
steering/tech.mdの「セキュリティポリシー(全画面共通)」を参照。
依存仕様
social-login/requirements.mdcredit-purchase/requirements.md