# 画面設計書 11-注文完了ページ

## 概要

本ドキュメントは、Shopware 6のStorefrontにおける「注文完了ページ」の画面設計書です。注文処理が正常に完了した後に表示されるサンクスページの仕様を記載しています。

### 本画面の処理概要

注文完了ページは、顧客が商品購入の全プロセス（カート投入、チェックアウト、支払い処理）を完了した後に表示される確認画面です。注文番号、注文した商品の詳細、配送先・請求先住所、選択した支払い方法・配送方法などの注文情報を一覧表示し、顧客に購入完了を通知します。

**業務上の目的・背景**：ECサイトにおいて注文完了後の確認画面は、顧客に購入が正常に処理されたことを伝える重要な役割を担います。注文番号を明示することで、問い合わせ時の参照情報となり、また注文内容を再確認する機会を提供することで顧客満足度の向上に寄与します。ゲスト購入の場合は自動ログアウト処理も行われ、セキュリティを確保します。

**画面へのアクセス方法**：注文確認画面で「注文確定」ボタンをクリックし、支払い処理が正常に完了すると自動的にリダイレクトされます。URLパラメータとしてorderIdが渡されます（例：/checkout/finish?orderId=xxxx）。

**主要な操作・処理内容**：
1. 注文情報の表示（注文番号、注文日時、商品明細）
2. 配送先・請求先住所の表示
3. 支払い方法・配送方法の表示
4. 注文合計金額の表示
5. 顧客コメントの表示（入力されている場合）
6. ゲスト顧客の自動ログアウト処理

**画面遷移**：
- 遷移元：注文確認ページ（frontend.checkout.confirm.page）から注文確定後にリダイレクト
- 遷移先：ホームページ、アカウントホームページ、注文履歴ページへのナビゲーション
- 支払い失敗時：注文編集ページ（frontend.account.edit-order.page）へリダイレクト

**権限による表示制御**：ログイン済みの顧客のみアクセス可能です。未ログインの場合はチェックアウト登録ページへリダイレクトされます。ゲスト顧客の場合、設定により注文完了後に自動ログアウトされます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 49 | 注文完了ページ | 主機能 | 注文完了後のサンクスページ表示（CheckoutController::finishPage） |
| 2 | ログアウト | 補助機能 | ゲスト注文時の自動ログアウト処理 |

## 画面種別

詳細表示

## URL/ルーティング

| 項目 | 値 |
|------|-----|
| URL | /checkout/finish |
| ルート名 | frontend.checkout.finish.page |
| HTTPメソッド | GET |
| 必須パラメータ | orderId（クエリパラメータ） |

## 入出力項目

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| orderId | string | Yes | 表示対象の注文ID（UUIDv4形式） |
| changedPayment | boolean | No | 支払い方法が変更されたかどうか |
| paymentFailed | boolean | No | 支払いが失敗したかどうか |

## 表示項目

| セクション | 表示項目 | データソース |
|------------|----------|--------------|
| 注文詳細 | 注文番号 | order.orderNumber |
| 注文詳細 | 注文日時 | order.orderDateTime |
| 注文詳細 | 注文ステータス | order.stateMachineState |
| 配送先住所 | 氏名 | order.deliveries.shippingOrderAddress |
| 配送先住所 | 住所 | order.deliveries.shippingOrderAddress |
| 配送先住所 | 国・地域 | order.deliveries.shippingOrderAddress.country |
| 請求先住所 | 氏名 | order.billingAddress |
| 請求先住所 | 住所 | order.billingAddress |
| 請求先住所 | 国・地域 | order.billingAddress.country |
| 支払い方法 | 支払い方法名 | order.transactions.paymentMethod |
| 配送方法 | 配送方法名 | order.deliveries.shippingMethod |
| 商品明細 | 商品名 | order.lineItems.label |
| 商品明細 | 数量 | order.lineItems.quantity |
| 商品明細 | 単価 | order.lineItems.unitPrice |
| 商品明細 | 小計 | order.lineItems.totalPrice |
| 商品明細 | 商品画像 | order.lineItems.cover |
| 合計 | 小計 | order.price.netPrice |
| 合計 | 税額 | order.price.calculatedTaxes |
| 合計 | 送料 | order.shippingTotal |
| 合計 | 総合計 | order.amountTotal |
| 顧客コメント | コメント内容 | order.customerComment |

## イベント仕様

### 1-ページ読み込み時

1. 顧客のログイン状態を確認
2. orderIdパラメータから注文情報を取得
3. 注文が顧客に紐づいているか検証
4. 支払い失敗フラグがtrueの場合、注文編集ページへリダイレクト
5. ゲスト顧客かつ設定が有効な場合、自動ログアウト処理を実行
6. CheckoutFinishPageLoadedHookを発火
7. 注文の丸め設定をSalesChannelContextに反映

### 2-ゲスト顧客ログアウト処理

- 条件：ゲスト顧客 AND core.cart.logoutGuestAfterCheckout設定が有効
- 処理：AbstractLogoutRouteを呼び出してセッションを破棄

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| ページ表示 | order | SELECT | 注文情報の取得 |
| ゲストログアウト | customer | UPDATE | ゲスト顧客のセッション情報更新 |

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

#### order（参照のみ）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | id, order_number, order_date_time, etc. | orderId = リクエストパラメータ AND customer_id = ログイン顧客ID | 注文情報全体を取得 |

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|----------|---------------|
| checkout.finishMetaTitle | 情報 | 常時 | ページタイトルに表示 |
| error.{errorCode} | エラー | 注文取得失敗時 | エラーコードに応じたメッセージ |

## 例外処理

| 例外 | 発生条件 | 処理内容 |
|------|----------|----------|
| CustomerNotLoggedInException | 未ログイン状態でアクセス | frontend.checkout.register.pageへリダイレクト |
| OrderException | 注文が見つからない | エラーメッセージを表示しfrontend.checkout.cart.pageへリダイレクト |
| RoutingException | orderIdパラメータが未指定 | エラーメッセージを表示しカートページへリダイレクト |

## 備考

- SEO設定：robots="noindex,follow"
- キャッシュ：無効化（PlatformRequest::ATTRIBUTE_NO_STORE = true）
- ヘッダー・フッターは簡易版（header-minimal、footer-minimal）を使用
- 注文の丸め設定（itemRounding、totalRounding）がある場合、SalesChannelContextに反映される

---

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

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

### 推奨読解順序

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

まず、注文完了ページで扱うデータ構造（CheckoutFinishPage）を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | CheckoutFinishPage.php | `src/Storefront/Page/Checkout/Finish/CheckoutFinishPage.php` | ページオブジェクトの構造、order/changedPayment/paymentFailed/logoutCustomerプロパティ |
| 1-2 | OrderEntity.php | `src/Core/Checkout/Order/OrderEntity.php` | 注文エンティティの構造、lineItems/deliveries/transactions等のリレーション |

**読解のコツ**: CheckoutFinishPageはPage基底クラスを継承しており、setOrder/getOrderメソッドで注文情報を保持します。

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

処理の起点となるコントローラーメソッドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | CheckoutController.php | `src/Storefront/Controller/CheckoutController.php` | finishPageメソッド（162-207行目）がエントリーポイント |

**主要処理フロー**:
1. **171-173行目**: 顧客ログイン状態チェック、未ログインならリダイレクト
2. **176行目**: CheckoutFinishPageLoaderでページオブジェクトを読み込み
3. **183行目**: CheckoutFinishPageLoadedHookを発火
4. **185-193行目**: 支払い失敗時の処理、注文編集ページへリダイレクト
5. **195-197行目**: ゲスト顧客の自動ログアウト処理
6. **202-206行目**: テンプレートをレンダリングして返却

#### Step 3: PageLoaderを理解する

ページデータの組み立てロジックを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | CheckoutFinishPageLoader.php | `src/Storefront/Page/Checkout/Finish/CheckoutFinishPageLoader.php` | loadメソッドでページデータを組み立て |

**主要処理フロー**:
- **52-82行目**: loadメソッド全体
- **54-56行目**: GenericPageLoaderで基本ページ情報を取得
- **59-61行目**: Profilerでトレースしながら注文情報を取得
- **63-67行目**: changedPayment/paymentFailed/logoutCustomerフラグを設定
- **98-153行目**: getOrderメソッドで注文情報をデータベースから取得

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

表示ロジックを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | index.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/finish/index.html.twig` | メインテンプレート、_page.html.twigを継承 |
| 4-2 | finish-details.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/finish/finish-details.html.twig` | 注文詳細セクション |
| 4-3 | finish-address.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/finish/finish-address.html.twig` | 住所表示セクション |

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

```
CheckoutController::finishPage()
    |
    +-- CheckoutFinishPageLoader::load()
    |       |
    |       +-- GenericPageLoader::load()
    |       |
    |       +-- AbstractOrderRoute::load()
    |       |       |
    |       |       +-- OrderEntity (with associations)
    |       |
    |       +-- SystemConfigService::get()
    |
    +-- CheckoutFinishPageLoadedHook
    |
    +-- AbstractLogoutRoute::logout() [条件付き]
    |
    +-- renderStorefront()
```

### データフロー図

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

Request
  orderId ─────────> CheckoutController
                           |
                           v
                     CheckoutFinishPageLoader
                           |
                           v
                     AbstractOrderRoute::load()
                           |
                           v
                     OrderEntity
                     (with lineItems,
                      deliveries,
                      transactions)
                           |
                           v
                     CheckoutFinishPage ──────────> Twig Template
                                                       |
                                                       v
                                                  HTML Response
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| CheckoutController.php | `src/Storefront/Controller/CheckoutController.php` | コントローラー | ルーティングとリクエスト処理 |
| CheckoutFinishPageLoader.php | `src/Storefront/Page/Checkout/Finish/CheckoutFinishPageLoader.php` | PageLoader | ページデータの組み立て |
| CheckoutFinishPage.php | `src/Storefront/Page/Checkout/Finish/CheckoutFinishPage.php` | DTO | ページデータを保持するオブジェクト |
| CheckoutFinishPageLoadedEvent.php | `src/Storefront/Page/Checkout/Finish/CheckoutFinishPageLoadedEvent.php` | イベント | ページ読み込み完了イベント |
| CheckoutFinishPageLoadedHook.php | `src/Storefront/Page/Checkout/Finish/CheckoutFinishPageLoadedHook.php` | フック | 拡張ポイント |
| index.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/finish/index.html.twig` | テンプレート | メイン画面テンプレート |
| finish-details.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/finish/finish-details.html.twig` | テンプレート | 注文詳細セクション |
| finish-address.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/finish/finish-address.html.twig` | テンプレート | 住所表示セクション |
| _page.html.twig | `src/Storefront/Resources/views/storefront/page/checkout/_page.html.twig` | テンプレート | チェックアウト共通レイアウト |
| AbstractOrderRoute.php | `src/Core/Checkout/Order/SalesChannel/AbstractOrderRoute.php` | Store API | 注文情報取得API |
| AbstractLogoutRoute.php | `src/Core/Checkout/Customer/SalesChannel/AbstractLogoutRoute.php` | Store API | ログアウトAPI |
