# 通知設計書 41-支払方法未選択警告

## 概要

本ドキュメントは、チェックアウト画面において支払方法が未選択の状態で次のステップへ進もうとした際に表示される警告通知の設計について記述する。

### 本通知の処理概要

本通知は、ユーザーがチェックアウトプロセスにおいて支払方法を選択せずに次のステップ（注文確認画面）へ進もうとした際に表示される警告通知である。

**業務上の目的・背景**：ECアプリにおいて、注文を完了するためには支払方法の選択が必須である。支払方法が未選択のまま注文処理を進めると、決済ができず注文が完了しない。本通知により、ユーザーに支払方法の選択を促し、チェックアウトプロセスを正常に完了させることを目的とする。

**通知の送信タイミング**：チェックアウト画面のステップ3（支払方法選択画面）において、「進む」ボタンをタップした際に、paymentId（支払方法ID）が空文字列である場合に即時表示される。

**通知の受信者**：チェックアウト操作を行っている現在のユーザー（アプリ操作者）。ログイン済みユーザーおよびゲストユーザーの両方が対象となる。

**通知内容の概要**：警告メッセージとして「支払方法を選択してください」という趣旨のローカライズされたテキストが表示される。画面上部に黄色（amber）の背景色でオーバーレイ表示され、警告アイコン付きで注意を喚起する。

**期待されるアクション**：ユーザーは通知を確認後、支払方法選択画面で利用可能な支払方法（銀行振込、代金引換、PayPal等）から1つを選択し、再度「進む」ボタンをタップして次のステップへ進む。

## 通知種別

アプリ内通知（オーバーレイ警告通知）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（即時表示） |
| 優先度 | 高 |
| リトライ | 無し（即時1回表示） |

### 送信先決定ロジック

操作中のユーザーに対して即時表示。特定の送信先決定ロジックは不要。

## 通知テンプレート

### アプリ内通知

| 項目 | 内容 |
|-----|------|
| タイトル | Warning（StringConstants.warning のローカライズ値） |
| 背景色 | Colors.amber（黄色） |
| アイコン | Icons.warning_amber（警告アイコン） |
| 形式 | オーバーレイ通知 |

### 本文テンプレート

```
[タイトル]: Warning
[メッセージ]: 支払方法を選択してください（StringConstants.pleaseSelectPayment のローカライズ値）
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| pleaseSelectPayment | 支払方法選択を促すメッセージ | StringConstants.pleaseSelectPayment | Yes |
| warning | 警告タイトル | StringConstants.warning | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | 「進む」ボタンタップ | currentIndex == 3 && paymentId == '' | 支払方法選択画面で支払方法が未選択の状態 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| paymentId != '' | 支払方法が選択されている場合は通知を表示せず、次のステップへ進む |
| currentIndex != 3 | 支払方法選択画面以外では本通知は発生しない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[「進む」ボタンタップ] --> B{currentIndex == 3?}
    B -->|No| C[他のステップの処理]
    B -->|Yes| D{paymentId == ''?}
    D -->|No| E[次のステップへ遷移]
    D -->|Yes| F[ShowMessage.warningNotification呼び出し]
    F --> G[オーバーレイ通知表示]
    G --> H[ユーザーが支払方法を選択]
    H --> I[再度「進む」ボタンタップ]
```

## データベース参照・更新仕様

### 参照テーブル一覧

本通知はクライアント側のみで完結するため、データベース参照は発生しない。

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| ローカライズエラー | 言語ファイルに該当キーが存在しない | デフォルト言語（英語）のメッセージを表示 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（24時間）

## セキュリティ考慮事項

- 本通知は個人情報を含まないため、特別なセキュリティ対策は不要
- クライアント側のみで処理が完結するため、通信の暗号化は不要

## 備考

- 本通知は overlay_support パッケージを使用して実装されている
- 通知は自動的にスライドして消えるか、ユーザーが上方向にスワイプして消すことができる
- 同一条件で連続してタップした場合、通知は毎回表示される

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、チェックアウト画面の状態管理で使用される変数を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | checkout_screen.dart | `lib/screens/checkout/view/checkout_screen.dart` | paymentId 変数（60行目）の定義と初期値を確認 |

**読解のコツ**: Flutter の StatefulWidget における状態変数の初期化と更新パターンに注目する。

#### Step 2: エントリーポイントを理解する

処理の起点となるボタンタップイベントを特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | checkout_screen.dart | `lib/screens/checkout/view/checkout_screen.dart` | onPressed コールバック（436-481行目、548-576行目）の条件分岐を確認 |

**主要処理フロー**:
1. **436-476行目**: StreamBuilder 内の onPressed でボタンタップを検知
2. **442-447行目**: currentIndex == 3 && paymentId == '' の条件チェック
3. **444-447行目**: ShowMessage.warningNotification の呼び出し

#### Step 3: 通知表示処理を理解する

ShowMessage クラスの warningNotification メソッドの実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | show_message.dart | `lib/widgets/show_message.dart` | warningNotification メソッド（58-77行目）の実装詳細を確認 |

**主要処理フロー**:
- **58行目**: warningNotification メソッドの定義
- **60-76行目**: showSimpleNotification の呼び出しとパラメータ設定
- **63行目**: 背景色を Colors.amber に設定
- **64-67行目**: 警告アイコンの設定

#### Step 4: 文字列定数を理解する

通知に使用される文字列定数を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | string_constants.dart | `lib/utils/string_constants.dart` | pleaseSelectPayment（206行目）と warning（134行目）の定義を確認 |

### プログラム呼び出し階層図

```
CheckoutScreen (_buildUI)
    │
    ├─ StreamBuilder.builder
    │      └─ MaterialButton.onPressed
    │             ├─ 条件判定: currentIndex == 3 && paymentId == ''
    │             └─ ShowMessage.warningNotification
    │                    └─ showSimpleNotification (overlay_support)
    │
    └─ CheckoutPaymentView.callBack
           └─ paymentId の更新
```

### データフロー図

```
[入力]                    [処理]                         [出力]

ボタンタップ ───▶ currentIndex/paymentId判定 ───▶ 警告通知表示
                           │
                           ▼
                  StringConstants取得
                           │
                           ▼
                  ローカライズ処理
                           │
                           ▼
                  showSimpleNotification
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| checkout_screen.dart | `lib/screens/checkout/view/checkout_screen.dart` | ソース | チェックアウト画面のメインWidget、通知トリガーの発火元 |
| show_message.dart | `lib/widgets/show_message.dart` | ソース | 通知表示ユーティリティクラス |
| string_constants.dart | `lib/utils/string_constants.dart` | ソース | 文字列定数の定義 |
| index.dart | `lib/screens/checkout/utils/index.dart` | ソース | チェックアウト関連のインポートをまとめたファイル |
