# 機能設計書 15-アカウント削除

## 概要

本ドキュメントは、Shopwareストアフロントにおける「アカウント削除」機能の設計内容を記載する。ログイン中の顧客が自身のアカウントを削除する機能であり、GDPR（EU一般データ保護規則）の「忘れられる権利」に対応する重要な機能である。

### 本機能の処理概要

**業務上の目的・背景**：GDPRをはじめとするプライバシー規制により、ユーザーは自身のデータの削除を要求する権利を持つ。本機能は、顧客が自らアカウントを削除できる手段を提供し、法的要件への準拠とユーザーの自己決定権を尊重する。アカウント削除後は、顧客データが物理的に削除され、ログイン不可となる。

**機能の利用シーン**：
- 顧客がサービスを今後利用しない場合
- 個人情報の削除を希望する場合（GDPR対応）
- アカウントを作り直したい場合

**主要な処理内容**：
1. ログイン認証の確認
2. 顧客データの削除
3. セッションの無効化
4. ホームページへのリダイレクト

**関連システム・外部連携**：Store API（DeleteCustomerRoute）を経由してデータを削除。DALのカスケード削除機能により関連データも削除。

**権限による制御**：ログイン必須（`LOGIN_REQUIRED`属性）。ゲストユーザーも許可（`LOGIN_REQUIRED_ALLOW_GUEST`）。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 17 | プロフィールページ | 主画面 | アカウント削除ボタン |

## 機能種別

CRUD操作（Delete） / セキュリティ処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| request | Request | Yes | HTTPリクエストオブジェクト | なし |
| context | SalesChannelContext | Yes | 販売チャネルコンテキスト | ログイン顧客情報を含む |
| customer | CustomerEntity | Yes | ログイン中の顧客エンティティ | セッションから自動取得 |

### 入力データソース

- セッション情報（ログイン顧客情報）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| flashMessage | string | 成功/エラーメッセージ |
| redirectResponse | Response | ホームページへのリダイレクト |

### 出力先

- セッション（フラッシュメッセージ）
- 画面リダイレクト（frontend.home.page または redirectTo先）

## 処理フロー

### 処理シーケンス

```
1. ルーティング処理
   └─ /account/profile/delete パスへのPOSTリクエストを受信

2. コントローラー処理 (AccountProfileController::deleteProfile)
   └─ DeleteCustomerRouteを呼び出し

3. 顧客削除ルート処理 (DeleteCustomerRoute::delete)
   └─ customerリポジトリのdelete実行（カスケード削除）

4. レスポンス生成
   ├─ 成功時：成功メッセージ設定、ホームページへリダイレクト
   └─ エラー時：エラーログ出力、エラーメッセージ設定
```

### フローチャート

```mermaid
flowchart TD
    A[POST /account/profile/delete] --> B{ログイン済み?}
    B -->|No| C[ログイン画面へリダイレクト]
    B -->|Yes| D[DeleteCustomerRoute::delete]
    D --> E[customerRepository.delete]
    E --> F{削除成功?}
    F -->|Yes| G[NoContentResponse返却]
    G --> H[成功メッセージ設定]
    H --> I{redirectTo存在?}
    I -->|Yes| J[redirectTo先へ遷移]
    I -->|No| K[ホームページへリダイレクト]
    F -->|No| L[例外発生]
    L --> M[エラーログ出力]
    M --> N[エラーメッセージ設定]
    N --> O[エラーレスポンス]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-15-01 | ログイン必須 | 未ログインユーザーはアクセス不可 | 全リクエスト |
| BR-15-02 | ゲスト許可 | ゲストユーザーも利用可能 | LOGIN_REQUIRED_ALLOW_GUEST設定時 |
| BR-15-03 | 物理削除 | 顧客データは物理的に削除される | 全リクエスト |
| BR-15-04 | カスケード削除 | 関連データ（住所、注文等）は設定に従い処理される | DAL設定による |
| BR-15-05 | セッション終了 | 削除後はセッションが無効化される | 削除成功時 |

### 計算ロジック

特になし

## データベース操作仕様

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 顧客削除 | customer | DELETE | 顧客レコードの物理削除 |
| 住所削除 | customer_address | DELETE | カスケード削除（ON DELETE CASCADE） |
| その他関連 | customer_* | DELETE/UPDATE | DAL設定に従う |

### テーブル別操作詳細

#### customer

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | id | ログイン顧客のID | 物理削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Exception | 削除処理中のエラー | エラーログ出力、汎用エラーメッセージ表示 |

### リトライ仕様

特になし

## トランザクション仕様

DAL（Data Abstraction Layer）のdeleteメソッドにより、削除処理がトランザクション内で実行される。カスケード削除を含む。

## パフォーマンス要件

- 単一レコードとその関連データの削除のため、特別なパフォーマンス要件なし
- カスケード削除による関連レコード数によっては処理時間が変動する可能性あり

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

- LOGIN_REQUIRED属性によりログイン必須を強制
- 顧客は自分自身のアカウントのみ削除可能（customer.idはセッションから取得）
- 削除後はセッションが無効化されるため、再アクセス不可
- GDPR準拠の個人データ削除

## 備考

- 削除は取り消し不可能な操作
- 注文履歴等の法的保持義務がある場合は、DAL設定で匿名化等の対応が必要
- フロントエンドでは確認ダイアログを表示することが推奨される

---

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

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

### 推奨読解順序

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

顧客エンティティと関連の削除動作を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | CustomerDefinition.php | `src/Core/Checkout/Customer/CustomerDefinition.php` | 顧客エンティティの関連定義を確認 |
| 1-2 | NoContentResponse.php | `src/Core/System/SalesChannel/NoContentResponse.php` | 削除成功時のレスポンス形式 |

**読解のコツ**: CustomerDefinitionの関連定義（OneToMany, ManyToOne等）がカスケード削除の動作を決定する。

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

コントローラーでのリクエスト処理を理解する。

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

**主要処理フロー**:
1. **176-177行目**: `$this->deleteCustomerRoute->delete($context, $customer)` で顧客削除ルート呼び出し
2. **178行目**: 成功時、成功メッセージをフラッシュに設定
3. **179-181行目**: 例外発生時、エラーログ出力とエラーメッセージ設定
4. **184-185行目**: redirectTo/forwardToがある場合は指定先に遷移
5. **188行目**: デフォルトはホームページへリダイレクト

#### Step 3: Store APIルートを理解する

実際の削除ロジックを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | DeleteCustomerRoute.php | `src/Core/Checkout/Customer/SalesChannel/DeleteCustomerRoute.php` | deleteメソッド（44-49行目）の処理フローを確認 |

**主要処理フロー**:
- **46行目**: `$this->customerRepository->delete([['id' => $customer->getId()]], $context->getContext())` でDAL経由の削除
- **48行目**: NoContentResponseの返却

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

```
AccountProfileController::deleteProfile
    │
    └─ DeleteCustomerRoute::delete
           │
           └─ customerRepository.delete
                  │
                  └─ DAL Delete処理
                         │
                         ├─ customer DELETE
                         ├─ customer_address DELETE (cascade)
                         └─ その他関連 DELETE/UPDATE
```

### データフロー図

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

POST /account/profile/delete
        │
        ▼
SalesChannelContext ───▶ AccountProfileController::deleteProfile
        │                         │
        ▼                         ▼
CustomerEntity ─────────▶ DeleteCustomerRoute::delete
                                  │
                                  ▼
                         customerRepository.delete
                                  │
                                  ▼
                         DAL (カスケード削除)
                                  │
                                  ▼
                         NoContentResponse
                                  │
                                  ▼
                         フラッシュメッセージ設定
                                  │
                                  ▼
                         ホームページへリダイレクト
                         (セッション終了)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| AccountProfileController.php | `src/Storefront/Controller/AccountProfileController.php` | コントローラー | HTTPリクエスト処理のエントリーポイント |
| DeleteCustomerRoute.php | `src/Core/Checkout/Customer/SalesChannel/DeleteCustomerRoute.php` | Store API | アカウント削除ビジネスロジック |
| AbstractDeleteCustomerRoute.php | `src/Core/Checkout/Customer/SalesChannel/AbstractDeleteCustomerRoute.php` | 抽象クラス | Store APIの抽象定義 |
| CustomerDefinition.php | `src/Core/Checkout/Customer/CustomerDefinition.php` | エンティティ定義 | 顧客エンティティとその関連定義 |
| NoContentResponse.php | `src/Core/System/SalesChannel/NoContentResponse.php` | レスポンス | 204 No Contentレスポンス |
| index.html.twig | `src/Storefront/Resources/views/storefront/page/account/profile/index.html.twig` | テンプレート | アカウント削除ボタン |
