# 帳票設計書 5-GDPR Data Export HTML（GDPRデータエクスポートHTML）

## 概要

本ドキュメントは、ECモバイルアプリにおけるGDPRデータエクスポートHTML帳票の設計仕様を定義するものである。GDPR（EU一般データ保護規則）に準拠した顧客データをHTML形式で外部ブラウザに表示する機能について記述する。

### 本帳票の処理概要

本帳票は、顧客が自身の個人データをHTML形式で閲覧するための機能を提供する。外部ブラウザを起動してバックエンドサーバーのHTML表示URLにリダイレクトし、認証済みの顧客データを表示する。

**業務上の目的・背景**：GDPR第15条「アクセス権」に基づき、データ主体（顧客）は自身に関する個人データへのアクセスを要求する権利を有する。本帳票は、PDFダウンロードとは異なり、即座にブラウザ上でデータを確認できる代替手段を提供する。これにより、ダウンロードせずにデータを確認したい顧客のニーズに対応し、より柔軟なデータアクセス方法を提供する。

**帳票の利用シーン**：顧客がGDPRデータリクエスト画面からHTMLエクスポートボタンをタップし、自身の個人データをブラウザで閲覧する場面で利用される。データの即時確認、ダウンロード不要の簡易確認、スクリーンショットによる保存などに使用される。

**主要な出力内容**：
1. 顧客の個人情報（氏名、メールアドレス、住所等）
2. 注文履歴
3. アカウント活動履歴
4. その他システムに保存された顧客関連データ

**帳票の出力タイミング**：GDPRデータリクエスト画面において、「HTML」ボタンをタップした際に、外部ブラウザが起動しバックエンドのHTML表示URLにアクセスする。

**帳票の利用者**：自身の個人データを即座に確認したい一般顧客（エンドユーザー）。

## 帳票種別

データエクスポート帳票（HTML形式・外部ブラウザ表示）

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| - | GDPRデータリクエスト画面 | GdprScreen（Flutter Widget） | 「HTML」ボタンをタップ |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | HTML（Webページ） |
| 用紙サイズ | N/A（ブラウザ表示） |
| 向き | N/A（ブラウザ表示） |
| ファイル名 | N/A（URL直接アクセス） |
| 出力方法 | 外部ブラウザでURL表示 |
| 文字コード | UTF-8 |

### PDF固有設定

N/A

### Excel固有設定

N/A

## 帳票レイアウト

### レイアウト概要

HTMLの具体的なレイアウトはバックエンドで生成される。モバイルアプリは外部ブラウザを起動してURLにリダイレクトする役割のみを担う。

```
┌─────────────────────────────────────┐
│      GDPR Data Export (HTML)        │
│      ─────────────────────          │
│      External Browser View          │
├─────────────────────────────────────┤
│     Personal Information            │
│     - Name                          │
│     - Email                         │
│     - Address                       │
│     - Phone                         │
├─────────────────────────────────────┤
│     Order History                   │
│     - Order details                 │
├─────────────────────────────────────┤
│     Account Activity                │
│     - Login history                 │
│     - Data changes                  │
└─────────────────────────────────────┘
```

### ヘッダー部

バックエンドで定義（モバイルアプリでは制御不可）

### 明細部

バックエンドで定義（モバイルアプリでは制御不可）

### フッター部

バックエンドで定義（モバイルアプリでは制御不可）

## 出力条件

### 抽出条件

| 条件名 | 説明 | 必須 |
|-------|------|-----|
| 認証セッション | ブラウザで認証済みである必要がある | Yes |

### ソート順

バックエンドで定義

### 改ページ条件

N/A（ブラウザスクロール）

## データベース参照仕様

### 参照テーブル一覧

バックエンドで処理。以下は想定されるテーブル。

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| customers | 顧客基本情報 | セッション認証されたユーザー |
| customer_addresses | 顧客住所情報 | customer_id一致 |
| orders | 注文履歴 | customer_id一致 |
| customer_activity_log | アクティビティログ | customer_id一致 |

### テーブル別参照項目詳細

バックエンドで定義。具体的なカラムはサーバー側の実装に依存する。

## 計算仕様

### 計算項目一覧

本帳票には計算項目は存在しない。すべてのデータはバックエンドから直接取得される。

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| - | - | - | 計算項目なし |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[GdprScreenでHTMLボタンをタップ] --> B[_exportButton onPressed]
    B --> C{label == 'HTML'?}
    C -->|Yes| D[launchUrl呼び出し]
    D --> E[Uri.parse baseDomain + /customer/account/gdpr/html-view]
    E --> F[LaunchMode.externalApplication指定]
    F --> G[外部ブラウザ起動]
    G --> H[バックエンドサーバーにHTTPリクエスト]
    H --> I{セッション認証?}
    I -->|認証済み| J[顧客データをHTML形式で表示]
    I -->|未認証| K[ログインページにリダイレクト]
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| ブラウザ起動失敗 | launchUrl失敗 | OS依存のエラー | url_launcherのエラーハンドリング |
| セッション切れ | ブラウザでのセッション無効 | ログインページ表示 | 再ログインが必要 |
| サーバーエラー | バックエンド障害 | HTTP 500エラーページ | バックエンド側の対応が必要 |
| ネットワークエラー | 通信不可 | ブラウザのエラー表示 | ネットワーク接続確認 |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 1ユーザーにつき1ページ |
| 目標出力時間 | ブラウザ起動は即時、ページ表示はサーバー依存 |
| 同時出力数上限 | N/A（外部ブラウザ依存） |

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

- ブラウザ側でセッション認証が必要（アプリのログイン状態とは独立）
- HTTPSで通信（baseDomainの設定に依存）
- 外部ブラウザを使用するため、アプリ内のセッションは共有されない可能性がある
- ブラウザにキャッシュされる可能性があるため、共有デバイスでの使用に注意が必要
- 個人情報が表示されるため、公共の場所での閲覧には注意が必要

## 備考

- 本帳票はアプリ内表示ではなく、外部ブラウザでの表示となる
- url_launcherパッケージを使用して外部ブラウザを起動
- LaunchMode.externalApplicationを指定することで、アプリ内WebViewではなく外部ブラウザで開く
- baseDomainはアプリの設定から取得される動的な値
- アプリとブラウザのセッションは独立しているため、ブラウザ側で別途ログインが必要な場合がある
- PDF形式との違い：HTMLはダウンロード不要で即座に確認可能、PDFはオフラインでも閲覧可能

---

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

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

### 推奨読解順序

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

HTML表示機能は非常にシンプルな実装であり、主にGDPR画面のボタンアクションで完結する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | gdpr_screen.dart | `lib/screens/gdpr/view/gdpr_screen.dart` | _exportButton()メソッドでHTML表示処理を理解 |

**主要処理フロー**:
1. **307-324行目**: _exportButton()でPDF/HTMLボタンのUI定義
2. **312-314行目**: HTMLボタンタップ時の処理
   - `launchUrl(Uri.parse("$baseDomain/customer/account/gdpr/html-view"), mode: LaunchMode.externalApplication);`
3. **9行目**: url_launcherパッケージのインポート

**読解のコツ**: HTMLエクスポートはGraphQL APIを使用せず、直接外部URLを開くシンプルな実装。baseDomainはアプリの設定で定義されているベースURLを参照。

#### Step 2: URL構成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | gdpr_screen.dart | `lib/screens/gdpr/view/gdpr_screen.dart` | baseDomain変数の参照元を確認（アプリ設定から取得） |

**URLパターン**:
- 完全URL: `{baseDomain}/customer/account/gdpr/html-view`
- 例: `https://example.com/customer/account/gdpr/html-view`

#### Step 3: url_launcherの動作を理解する

| 順序 | 外部ドキュメント | 参照先 | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | url_launcher | pub.dev | LaunchMode.externalApplicationで外部ブラウザ起動の動作を確認 |

**LaunchModeの違い**:
- `inAppWebView`: アプリ内WebViewで開く
- `externalApplication`: 外部ブラウザで開く（本実装で使用）
- `platformDefault`: プラットフォームのデフォルト動作

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

```
GdprScreen (Widget)
    │
    └─ _exportButton('HTML')
           │
           └─ onPressed:
                  │
                  └─ launchUrl(
                         Uri.parse("$baseDomain/customer/account/gdpr/html-view"),
                         mode: LaunchMode.externalApplication
                     )
                         │
                         └─ 外部ブラウザ起動
                                │
                                └─ Backend Server
                                       │
                                       └─ /customer/account/gdpr/html-view
                                              │
                                              └─ HTML形式で顧客データ表示
```

### データフロー図

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

HTMLボタンタップ ────▶ _exportButton() onPressed
                          │
                          ▼
                  launchUrl()
                  - URL: $baseDomain/customer/account/gdpr/html-view
                  - mode: LaunchMode.externalApplication
                          │
                          ▼
                  OS: 外部ブラウザ起動
                          │
                          ▼
                  HTTP Request to Backend Server
                          │
                          ▼
                  Backend: セッション認証チェック
                          │
                          ├─ 認証OK ─▶ 顧客データHTML生成 ─▶ ブラウザ表示
                          │
                          └─ 認証NG ─▶ ログインページにリダイレクト
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| gdpr_screen.dart | `lib/screens/gdpr/view/gdpr_screen.dart` | ソース | GDPR画面のUI実装、HTMLボタンの処理 |
| url_launcher | 外部パッケージ | ライブラリ | 外部URLを開くためのFlutterプラグイン |

### PDF形式との比較

| 項目 | PDF形式（No.4） | HTML形式（No.5） |
|-----|----------------|-----------------|
| 処理方式 | GraphQL API経由でBase64データ取得 | 外部ブラウザでURL直接アクセス |
| 保存場所 | ローカルストレージ | ブラウザキャッシュ（一時的） |
| オフライン閲覧 | 可能 | 不可 |
| 実装の複雑さ | 中（ファイル保存処理） | 低（URL起動のみ） |
| セッション管理 | アプリ内トークン | ブラウザCookie |
| 印刷 | PDFビューアから | ブラウザの印刷機能 |
