# 画面設計書 16-アカウントホームページ

## 概要

本ドキュメントは、Shopware 6のStorefrontにおける「アカウントホームページ」の画面設計書です。ログイン済み顧客のアカウント概要を表示するダッシュボード画面の仕様を記載しています。

### 本画面の処理概要

アカウントホームページは、ログイン済み顧客がアカウント関連の情報を一覧で確認できるダッシュボード画面です。プロフィール情報、デフォルト配送先・請求先住所、最新の注文情報、ニュースレター購読状況などを一画面で確認できます。各セクションから詳細ページへの遷移が可能で、アカウント管理の起点となる画面です。

**業務上の目的・背景**：顧客がアカウント情報を効率的に管理できるようにすることで、顧客体験を向上させます。重要な情報を一覧表示することで、プロフィールの確認・更新、住所管理、注文履歴へのアクセスを容易にします。

**画面へのアクセス方法**：
- ログイン後の自動リダイレクト
- ヘッダーのアカウントメニューから「アカウント概要」を選択
- 直接URL（/account）にアクセス

**主要な操作・処理内容**：
1. プロフィール情報の確認
2. デフォルト住所の確認・変更ナビゲーション
3. 最新注文の確認
4. ニュースレター購読状況の確認・変更
5. 各詳細ページへのナビゲーション

**画面遷移**：
- 遷移元：ログイン成功、各種リダイレクト、アカウントメニュー
- 遷移先：プロフィールページ、住所帳ページ、注文履歴ページ

**権限による表示制御**：ログイン必須（LOGIN_REQUIRED属性）。未ログインの場合はログインページへリダイレクト。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 8 | アカウント概要表示 | 主機能 | アカウントホームページの表示（AccountProfileController::index） |
| 10 | ニュースレター | 補助機能 | ニュースレター購読状況の表示・変更 |

## 画面種別

ダッシュボード

## URL/ルーティング

| 項目 | 値 |
|------|-----|
| URL | /account |
| ルート名 | frontend.account.home.page |
| HTTPメソッド | GET |

## 入出力項目

入力項目なし（参照専用画面）

## 表示項目

| セクション | 表示項目 | データソース |
|------------|----------|--------------|
| プロフィール | 敬称 | context.customer.salutation |
| プロフィール | 肩書き | context.customer.title |
| プロフィール | 氏名 | context.customer.firstName/lastName |
| プロフィール | 会社情報 | context.customer.company（ビジネス顧客の場合） |
| プロフィール | メールアドレス | context.customer.email |
| 配送先住所 | デフォルト配送先住所 | context.customer.defaultShippingAddress |
| 配送先住所 | 配送可否警告 | context.customer.defaultShippingAddress.country.shippingAvailable |
| 請求先住所 | デフォルト請求先住所 | context.customer.defaultBillingAddress |
| 最新注文 | 注文情報 | page.newestOrder |
| ニュースレター | 購読状況 | page.newsletterAccountPagelet |
| グループ申請 | 申請中のグループ | page.customer.requestedGroup |

## イベント仕様

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

1. 顧客のログイン状態を確認（LOGIN_REQUIRED属性）
2. AccountOverviewPageLoaderでページデータを取得
3. 顧客情報を取得（requestedGroup、デフォルト住所含む）
4. 最新注文を取得
5. ニュースレター購読状況を取得
6. AccountOverviewPageLoadedHookを発火
7. テンプレートをレンダリング

### 2-配送不可警告表示

- 条件：デフォルト配送先住所の国がshippingAvailable=falseの場合
- 処理：警告アラートを表示

### 3-グループ申請情報表示

- 条件：page.customer.requestedGroupが存在する場合
- 処理：申請中のグループ名を表示

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| ページ表示 | customer | SELECT | 顧客情報の取得（requestedGroup含む） |
| ページ表示 | customer_address | SELECT | デフォルト住所の取得 |
| ページ表示 | order | SELECT | 最新注文の取得 |
| ページ表示 | newsletter_recipient | SELECT | ニュースレター購読状況の取得 |

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

アカウントホームページはデータベース更新を行いません（参照専用）。

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|----------|---------------|
| account.overviewTitle | 情報 | 常時 | ページタイトル |
| account.overviewInfo | 情報 | 常時 | ウェルカムメッセージ |
| account.overviewProfileHeader | 情報 | 常時 | プロフィールセクションタイトル |
| account.overviewNotAbleToShip | 警告 | 配送不可地域の場合 | 配送不可警告 |
| account.overviewCustomerGroupRequest | 情報 | グループ申請中の場合 | グループ申請状況 |
| account.newsletterTitle | 情報 | 常時 | ニュースレターセクションタイトル |
| account.overviewNewestOrderHeader | 情報 | 最新注文がある場合 | 最新注文セクションタイトル |

## 例外処理

| 例外 | 発生条件 | 処理内容 |
|------|----------|----------|
| CustomerNotLoggedInException | 未ログイン状態でアクセス | ログインページへリダイレクト |

## 備考

- SEO設定：robots="noindex,follow"
- キャッシュ：無効化（PlatformRequest::ATTRIBUTE_NO_STORE = true）
- サイドバーメニューを含むアカウントレイアウト（_page.html.twig）を継承
- ニュースレターセクションはPageletとして非同期読み込み可能

---

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

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

### 推奨読解順序

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

アカウント概要ページのPageクラスを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | AccountOverviewPage.php | `src/Storefront/Page/Account/Overview/AccountOverviewPage.php` | customer/newestOrder/newsletterAccountPageletプロパティ |
| 1-2 | NewsletterAccountPagelet.php | `src/Storefront/Pagelet/Newsletter/Account/NewsletterAccountPagelet.php` | ニュースレター購読状況データ |

**読解のコツ**: AccountOverviewPageは顧客情報、最新注文、ニュースレター購読状況を保持する複合的なPageクラスです。

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | AccountProfileController.php | `src/Storefront/Controller/AccountProfileController.php` | index（49-65行目） |

**主要処理フロー**:
1. **58行目**: CustomerEntityをメソッド引数として注入（LOGIN_REQUIREDにより保証）
2. **60行目**: AccountOverviewPageLoaderでページデータ取得
3. **62行目**: AccountOverviewPageLoadedHookを発火
4. **64行目**: テンプレートをレンダリング

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | AccountOverviewPageLoader.php | `src/Storefront/Page/Account/Overview/AccountOverviewPageLoader.php` | loadメソッドで各種データを組み立て |

**主要処理フロー**:
- **51-74行目**: loadメソッド全体
- **53-55行目**: GenericPageLoaderで基本ページ情報を取得
- **56行目**: loadCustomerで顧客情報（requestedGroup、デフォルト住所含む）を取得
- **59-63行目**: loadNewestOrderで最新注文を取得
- **65-67行目**: NewsletterAccountPageletLoaderでニュースレター状況を取得

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | index.html.twig | `src/Storefront/Resources/views/storefront/page/account/index.html.twig` | メインテンプレート |
| 4-2 | _page.html.twig | `src/Storefront/Resources/views/storefront/page/account/_page.html.twig` | アカウント共通レイアウト |
| 4-3 | address.html.twig | `src/Storefront/Resources/views/storefront/page/account/address.html.twig` | 住所表示コンポーネント |

**主要構造**:
- **6-14行目**: 配送不可警告
- **17-26行目**: グループ申請情報
- **28-36行目**: ウェルカムセクション
- **38-86行目**: メインコンテンツ（プロフィール、住所）
- **88-106行目**: ニュースレターセクション
- **108-140行目**: 最新注文セクション

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

```
AccountProfileController::index()
    |
    +-- AccountOverviewPageLoader::load()
    |       |
    |       +-- GenericPageLoader::load()
    |       |
    |       +-- AbstractCustomerRoute::load() (loadCustomer)
    |       |       |
    |       |       +-- CustomerEntity (with requestedGroup, defaultAddresses)
    |       |
    |       +-- AbstractOrderRoute::load() (loadNewestOrder)
    |       |       |
    |       |       +-- OrderEntity (最新1件)
    |       |
    |       +-- NewsletterAccountPageletLoader::load()
    |               |
    |               +-- NewsletterAccountPagelet
    |
    +-- AccountOverviewPageLoadedHook
    |
    +-- renderStorefront()
```

### データフロー図

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

Request ─────────────> AccountProfileController::index()
                              |
                              v
                        AccountOverviewPageLoader
                              |
                        +-----+-----+
                        |     |     |
                        v     v     v
                   Customer Order Newsletter
                    Route   Route  Pagelet
                        |     |     |
                        +-----+-----+
                              |
                              v
                        AccountOverviewPage ──────> Twig Template
                        (customer, newestOrder,         |
                         newsletterAccountPagelet)      v
                                                   HTML Response
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AccountProfileController.php | `src/Storefront/Controller/AccountProfileController.php` | コントローラー | ルーティングとリクエスト処理 |
| AccountOverviewPageLoader.php | `src/Storefront/Page/Account/Overview/AccountOverviewPageLoader.php` | PageLoader | ページデータの組み立て |
| AccountOverviewPage.php | `src/Storefront/Page/Account/Overview/AccountOverviewPage.php` | DTO | ページデータを保持 |
| AccountOverviewPageLoadedHook.php | `src/Storefront/Page/Account/Overview/AccountOverviewPageLoadedHook.php` | フック | 拡張ポイント |
| index.html.twig | `src/Storefront/Resources/views/storefront/page/account/index.html.twig` | テンプレート | メイン画面 |
| _page.html.twig | `src/Storefront/Resources/views/storefront/page/account/_page.html.twig` | テンプレート | アカウント共通レイアウト |
| address.html.twig | `src/Storefront/Resources/views/storefront/page/account/address.html.twig` | テンプレート | 住所表示コンポーネント |
| newsletter.html.twig | `src/Storefront/Resources/views/storefront/page/account/newsletter.html.twig` | テンプレート | ニュースレターセクション |
| AbstractCustomerRoute.php | `src/Core/Checkout/Customer/SalesChannel/AbstractCustomerRoute.php` | Store API | 顧客情報取得API |
| AbstractOrderRoute.php | `src/Core/Checkout/Order/SalesChannel/AbstractOrderRoute.php` | Store API | 注文情報取得API |
| NewsletterAccountPageletLoader.php | `src/Storefront/Pagelet/Newsletter/Account/NewsletterAccountPageletLoader.php` | PageletLoader | ニュースレター購読状況取得 |
