# 画面設計書 10-注文確認ページ

## 概要

本ドキュメントは、Shopware 6 Storefrontにおける注文確認ページの画面設計書である。注文内容の最終確認を行い、注文を確定する画面である。

### 本画面の処理概要

注文確認ページは、チェックアウトプロセスの最終段階として、配送先住所、請求先住所、支払方法、配送方法、注文商品、合計金額を確認し、利用規約への同意を得た上で注文を確定する画面である。

**業務上の目的・背景**：注文確認ページは、顧客が注文を確定する前の最終チェックポイントである。誤った配送先への発送、意図しない支払方法の選択、商品の数量ミスなどを防ぐため、すべての情報を一覧表示して確認を促す。また、法的要件として利用規約への同意を取得し、返品・交換ポリシーの確認も行う。この画面での明確な情報提示は、注文後のキャンセルや問い合わせを減少させる。

**画面へのアクセス方法**：カートページから「注文手続きへ進む」をクリック（ログイン済み時）、チェックアウト登録ページでの登録/ログイン完了後、URL直接アクセス（`/checkout/confirm`）でアクセスする。

**主要な操作・処理内容**：
1. 注文内容の表示（CheckoutConfirmPageLoader）
2. 配送先/請求先住所の確認・変更
3. 支払方法の確認・変更
4. 配送方法の確認・変更
5. 利用規約への同意
6. 注文の確定

**画面遷移**：
- 遷移元：カートページ、チェックアウト登録ページ
- 遷移先：注文完了ページ、注文編集ページ（支払い失敗時）、カートページ（カート空の場合）

**権限による表示制御**：ログインユーザーのみアクセス可能。未ログインユーザーはチェックアウト登録ページへリダイレクトされる。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 47 | 注文確認 | 主機能 | 注文内容の最終確認（CheckoutController::confirmPage） |
| 48 | 注文完了 | 遷移先機能 | 注文処理と支払い実行（CheckoutController::order） |
| 21 | 住所マネージャー | 補助機能 | 配送先・請求先住所の選択（AddressController::addressManager） |

## 画面種別

確認

## URL/ルーティング

| 項目 | 値 |
|------|-----|
| URL | `/checkout/confirm` |
| ルート名 | `frontend.checkout.confirm.page` |
| HTTPメソッド | GET |
| HTTPキャッシュ | 無効（_noStore） |
| SEO | 無効 |
| XmlHttpRequest | 対応 |

## 入出力項目

### 入力項目（注文確定時）

| 項目名 | パラメータ名 | 必須 | 型 | 説明 |
|--------|-------------|------|-----|------|
| 利用規約同意 | tos | 必須 | boolean | 利用規約チェックボックス |
| 返品条件同意 | revocation | 条件付き | boolean | デジタル商品がある場合 |
| 顧客コメント | customerComment | 任意 | string | 注文に関するコメント |
| カートハッシュ | hash | 必須 | string | カート整合性チェック用 |

### 出力データ

| 項目名 | データソース | 説明 |
|--------|-------------|------|
| page | CheckoutConfirmPageLoader | ページ全体のデータオブジェクト |
| page.cart | カートサービス | カートオブジェクト |
| page.paymentMethods | 設定 | 利用可能な支払方法 |
| page.shippingMethods | 設定 | 利用可能な配送方法 |
| context.customer | ログインユーザー | 顧客情報（住所含む） |

## 表示項目

| セクション | 表示項目 | 説明 |
|-----------|---------|------|
| ヘッダー | ミニマルヘッダー | ロゴのみのシンプルヘッダー |
| メイン | ページタイトル | 「注文内容の確認（{件数}個）」 |
| メイン | 利用規約セクション | 利用規約チェックボックスとリンク |
| メイン | 住所セクション | 請求先/配送先住所（変更リンク付き） |
| メイン | 支払方法 | 選択中の支払方法（変更リンク付き） |
| メイン | 配送方法 | 選択中の配送方法（変更リンク付き） |
| メイン | 商品テーブル | 商品画像、名前、数量、価格 |
| 追加 | 顧客コメント | コメント入力欄（設定による） |
| サイドバー | 注文サマリー | 小計、配送料、税、合計 |
| サイドバー | 注文確定ボタン | 「有料で注文する」 |
| フッター | ミニマルフッター | 簡易フッター |

## イベント仕様

### 1-注文確認ページ表示

確認URLにアクセスすると、CheckoutController::confirmPageメソッドが実行される。

**処理フロー**：
1. ログインしていない場合、チェックアウト登録ページへリダイレクト
2. カートが空の場合、カートページへリダイレクト
3. CheckoutConfirmPageLoaderでページデータを取得
4. カートエラーの処理（配送方法/支払方法変更等）
5. CheckoutConfirmPageLoadedHookを発火
6. ヘッダー/フッターPageletを取得
7. Twigテンプレートでレンダリング

### 2-住所変更

住所セクションの「変更」リンクをクリックすると、住所選択モーダルが表示される。

### 3-支払方法変更

支払方法セクションの「変更」リンクをクリックすると、支払方法選択フォームが展開される。

### 4-配送方法変更

配送方法セクションの「変更」リンクをクリックすると、配送方法選択フォームが展開される。

### 5-注文確定

「有料で注文する」ボタンをクリックすると、注文処理が実行される。

**エンドポイント**: `/checkout/order`
**ルート名**: `frontend.checkout.finish.order`
**HTTPメソッド**: POST

**処理フロー**：
1. ログインチェック（未ログインはリダイレクト）
2. アフィリエイトトラッキング情報をセッションから取得
3. OrderServiceで注文を作成
4. PaymentProcessorで支払い処理を実行
5. 成功時: 注文完了ページへリダイレクト
6. 支払い失敗時: 注文編集ページへリダイレクト

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| ページ表示 | cart, customer, payment_method, shipping_method | SELECT | データ参照 |
| 注文確定 | order, order_line_item, order_customer, order_address, order_transaction | INSERT | 注文データ作成 |
| 注文確定 | cart | DELETE | カートクリア |

### テーブル別更新項目詳細

#### order（注文確定時）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | order_number | 自動採番 | 注文番号 |
| INSERT | customer_id | ログインユーザーID | 顧客参照 |
| INSERT | sales_channel_id | 現在の販売チャネル | |
| INSERT | billing_address_id | 選択された請求先 | |
| INSERT | currency_id | 現在の通貨 | |
| INSERT | language_id | 現在の言語 | |
| INSERT | state_id | 初期ステータス | open |
| INSERT | amount_total | カート合計 | |
| INSERT | customer_comment | フォーム入力値 | 任意 |

## メッセージ仕様

| メッセージ種別 | 条件 | メッセージ内容 |
|--------------|------|--------------|
| エラー | 利用規約未同意 | 「利用規約に同意してください」 |
| エラー | 支払い失敗 | 「支払い処理に失敗しました」 |
| エラー | カート変更検出 | 「カートが変更されました」 |
| エラー | 在庫不足 | 「在庫が不足しています」 |

## 例外処理

| 例外条件 | 対応 |
|---------|------|
| 未ログイン | チェックアウト登録ページへリダイレクト |
| カート空 | カートページへリダイレクト |
| 利用規約未同意 | バリデーションエラー表示 |
| 支払い処理失敗 | 注文編集ページへリダイレクト |
| 在庫不足 | カートエラー表示 |
| カートハッシュ不一致 | エラー表示 |

## 備考

- ヘッダーとフッターはミニマル版を使用
- 利用規約チェックボックスの要否はシステム設定（core.cart.showTosCheckbox）による
- デジタル商品がある場合、返品条件への同意も必要（showRevocation）
- 顧客コメント欄の表示はシステム設定（core.cart.showCustomerComment）による
- カートハッシュによる整合性チェックで二重注文を防止
- フォーム送信時にブラウザ履歴に注文ページを追加（form-add-history）

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | CheckoutConfirmPage.php | `src/Storefront/Page/Checkout/Confirm/CheckoutConfirmPage.php` | ページオブジェクトの構造 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | CheckoutController.php | `src/Storefront/Controller/CheckoutController.php` | confirmPageメソッド（117-160行目） |

**主要処理フロー**:
1. **126-128行目**: ログインチェックとリダイレクト
2. **130-132行目**: カート空チェックとリダイレクト
3. **134行目**: CheckoutConfirmPageLoaderでページデータ取得
4. **135-136行目**: カートとエラーの取得
5. **138行目**: CheckoutConfirmPageLoadedHookでフック処理
6. **140行目**: addCartErrorsでエラーメッセージ追加
7. **142-150行目**: リダイレクトループ防止処理
8. **152-153行目**: ヘッダー/フッターPagelet取得
9. **155-159行目**: テンプレートレンダリング

#### Step 3: 注文処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | CheckoutController.php | `src/Storefront/Controller/CheckoutController.php` | orderメソッド（209-253行目） |

**主要処理フロー**:
- **217-219行目**: ログインチェック
- **222-224行目**: アフィリエイトトラッキングとOrderService::createOrder
- **225-241行目**: 各種例外のハンドリング
- **243-252行目**: PaymentProcessorで支払い処理

#### Step 4: テンプレート構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | index.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/confirm/index.html.twig` | メインテンプレート |
| 4-2 | confirm-address.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/confirm/confirm-address.html.twig` | 住所セクション |
| 4-3 | confirm-payment.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/confirm/confirm-payment.html.twig` | 支払方法セクション |
| 4-4 | confirm-shipping.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/confirm/confirm-shipping.html.twig` | 配送方法セクション |

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

```
CheckoutController::confirmPage()
    |
    +-- [ログインチェック] -> リダイレクト
    |
    +-- [カート空チェック] -> リダイレクト
    |
    +-- CheckoutConfirmPageLoader::load()
    |       |
    |       +-- CartService::getCart()
    |       +-- PaymentMethodRoute::load()
    |       +-- ShippingMethodRoute::load()
    |
    +-- CheckoutConfirmPageLoadedHook
    |
    +-- addCartErrors()
    |
    +-- HeaderPageletLoader / FooterPageletLoader
    |
    +-- renderStorefront()
            +-- confirm/index.html.twig

CheckoutController::order()
    |
    +-- addAffiliateTracking()
    |
    +-- OrderService::createOrder()
    |       |
    |       +-- order INSERT
    |       +-- order_line_item INSERT
    |       +-- order_customer INSERT
    |       +-- order_address INSERT
    |
    +-- PaymentProcessor::pay()
    |       |
    |       +-- order_transaction INSERT/UPDATE
    |
    +-- [成功] RedirectResponse -> finish
    +-- [失敗] RedirectResponse -> edit-order
```

### データフロー図

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

GET /checkout/confirm
        |
        v
CheckoutController::confirmPage()
        |
        +-- CheckoutConfirmPageLoader
        |
        v
CheckoutConfirmPage       -->  HTML Response
        |
        v
confirm/index.html.twig

POST /checkout/order
        |
        v
CheckoutController::order()
        |
        v
OrderService::createOrder()
        |
        v
PaymentProcessor::pay()
        |
        v
Redirect (finish / edit-order)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| CheckoutController.php | `src/Storefront/Controller/CheckoutController.php` | コントローラー | ルーティングエントリーポイント |
| CheckoutConfirmPageLoader.php | `src/Storefront/Page/Checkout/Confirm/CheckoutConfirmPageLoader.php` | ページローダー | ページデータの構築 |
| CheckoutConfirmPage.php | `src/Storefront/Page/Checkout/Confirm/CheckoutConfirmPage.php` | データ構造 | ページオブジェクト定義 |
| OrderService.php | `src/Core/Checkout/Order/SalesChannel/OrderService.php` | サービス | 注文作成処理 |
| PaymentProcessor.php | `src/Core/Checkout/Payment/PaymentProcessor.php` | サービス | 支払い処理 |
| index.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/confirm/index.html.twig` | テンプレート | メインテンプレート |
| confirm-address.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/confirm/confirm-address.html.twig` | テンプレート | 住所セクション |
| confirm-payment.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/confirm/confirm-payment.html.twig` | テンプレート | 支払方法セクション |
| confirm-shipping.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/confirm/confirm-shipping.html.twig` | テンプレート | 配送方法セクション |
