# 画面設計書 47-販売チャネル管理

## 概要

本ドキュメントは、Shopware 6 Administration（管理画面）における「販売チャネル管理」画面の設計書です。この画面はECサイト・APIチャネルの設定を行うマルチチャネル対応の中核機能を提供します。

### 本画面の処理概要

**業務上の目的・背景**：現代のECビジネスでは、自社サイト、マーケットプレイス、ソーシャルコマースなど複数の販売チャネルを運営することが一般的です。Shopware 6の販売チャネル機能は、単一のバックエンドから複数のフロントエンド（Storefront、Headless API、商品比較サイト連携など）を管理できます。本画面は販売チャネルの作成、設定、ドメイン管理、商品割当などを行う管理機能を提供します。

**画面へのアクセス方法**：管理画面にログイン後、左側メニューに表示される販売チャネル一覧から対象のチャネルをクリック、または新規作成でアクセスできます。URLパスは `/admin#/sw/sales/channel/detail/:id` となります。`sales_channel.viewer` 権限を持つユーザーのみがアクセス可能です。

**主要な操作・処理内容**：
1. 販売チャネル一覧の表示 - サイドメニューに販売チャネル一覧を表示
2. 販売チャネルの作成 - 新規販売チャネルの作成（Storefront、Headless、商品比較など）
3. 基本設定の編集 - 名前、言語、通貨、国、支払方法、配送方法などの設定
4. ドメイン管理 - アクセスURLと言語の紐付け設定
5. 商品割当 - 販売チャネルに表示する商品の選択
6. アナリティクス設定 - Google Analyticsなどの計測設定
7. 商品比較設定 - 商品フィードのエクスポート設定

**画面遷移**：
- 遷移元: ダッシュボード、サイドメニュー
- 遷移先: 各種設定画面（商品、カテゴリ、顧客など）

**権限による表示制御**：
- `sales_channel.viewer`: 閲覧権限 - 販売チャネル設定の表示が可能
- `sales_channel.creator`: 作成権限 - 新規作成が可能
- `sales_channel.editor`: 編集権限 - 設定の編集が可能
- `sales_channel.deleter`: 削除権限 - 削除が可能

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 70 | コンテキスト切替 | 主機能 | ECサイト・APIチャネルの設定 |

## 画面種別

詳細/編集（タブ切替: 基本 / 商品 / 商品比較 / アナリティクス）

## URL/ルーティング

- **パス**: `/admin#/sw/sales/channel/detail/:id` または `/admin#/sw/sales/channel/list`
- **コンポーネント**: `sw-sales-channel-detail` または `sw-sales-channel-list`
- **ルート名**: `sw.sales.channel.detail` または `sw.sales.channel.list`
- **必要権限**: `sales_channel.viewer`

## 入出力項目

| 項目名 | 種別 | 型 | 必須 | 説明 |
|--------|------|-----|------|------|
| name | 入力 | string | 必須 | 販売チャネル名 |
| typeId | 入力 | string | 必須 | チャネルタイプ（Storefront, Headless等） |
| languageId | 入力 | string | 必須 | デフォルト言語 |
| currencyId | 入力 | string | 必須 | デフォルト通貨 |
| paymentMethodId | 入力 | string | 必須 | デフォルト支払方法 |
| shippingMethodId | 入力 | string | 必須 | デフォルト配送方法 |
| countryId | 入力 | string | 必須 | デフォルト国 |
| customerGroupId | 入力 | string | 必須 | デフォルト顧客グループ |
| navigationCategoryId | 入力 | string | - | ナビゲーションルートカテゴリ |
| footerCategoryId | 入力 | string | - | フッターカテゴリ |
| serviceCategoryId | 入力 | string | - | サービスカテゴリ |
| domains | 入力 | array | - | ドメイン設定 |
| active | 入力 | boolean | - | 有効/無効 |
| maintenance | 入力 | boolean | - | メンテナンスモード |

## 表示項目

| 項目名 | 説明 | 編集可否 |
|--------|------|----------|
| チャネル名 | 販売チャネルの名称 | string |
| チャネルタイプ | Storefront/Headless/商品比較 | - |
| アクセスキー | API認証用のキー | - |
| ドメイン一覧 | 設定されたドメインとその言語 | array |
| 言語設定 | 利用可能な言語一覧 | array |
| 通貨設定 | 利用可能な通貨一覧 | array |
| 支払方法 | 利用可能な支払方法一覧 | array |
| 配送方法 | 利用可能な配送方法一覧 | array |
| 国設定 | 配送可能国一覧 | array |

## イベント仕様

### 1-販売チャネル読み込み

詳細画面表示時に販売チャネルデータを取得。

**処理フロー**:
1. `salesChannelRepository.get()` で販売チャネルデータを取得
2. 関連データ（ドメイン、言語、通貨など）をアソシエーションで取得
3. フォームにデータを表示

### 2-販売チャネル作成

新規作成ボタンからチャネルタイプを選択して作成。

**処理フロー**:
1. チャネルタイプ選択モーダルを表示
2. タイプ選択後、`sw.sales.channel.create` へ遷移
3. 必須項目を入力して保存
4. `salesChannelRepository.save()` でデータを作成

### 3-基本設定保存

基本設定タブで設定を変更して保存。

**処理フロー**:
1. フォームの値を変更
2. 保存ボタンをクリック
3. `salesChannelRepository.save()` でデータを更新
4. 成功/失敗の通知を表示

### 4-ドメイン管理

ドメインの追加、編集、削除。

**処理フロー**:
1. ドメイン追加/編集フォームを表示
2. URL、言語、通貨、スニペットセットを設定
3. 保存時に `salesChannelDomainRepository.save()` で保存

### 5-商品割当

販売チャネルに表示する商品を選択。

**処理フロー**:
1. 商品タブに切り替え
2. 商品選択モーダルを開く
3. 単品、カテゴリ、ダイナミックグループから選択
4. 割当情報を保存

### 6-販売チャネル削除

販売チャネルを削除。

**処理フロー**:
1. 削除確認モーダルを表示
2. 確定時、`salesChannelRepository.delete()` を実行
3. 成功後、一覧に戻る

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 販売チャネル取得 | sales_channel | SELECT | 販売チャネルデータの取得 |
| 販売チャネル作成 | sales_channel, sales_channel_domain 等 | INSERT | 新規作成 |
| 販売チャネル更新 | sales_channel | UPDATE | 設定の更新 |
| 販売チャネル削除 | sales_channel | DELETE | 削除 |
| ドメイン追加 | sales_channel_domain | INSERT | ドメイン設定追加 |
| 商品割当 | product_visibility | INSERT/DELETE | 商品の可視性設定 |

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

#### sales_channel

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | * | id指定 | 関連テーブル含む |
| INSERT | name, type_id, language_id, currency_id, ... | 入力値 | 新規作成時 |
| UPDATE | name, language_id, currency_id, ... | 入力値 | 更新時 |
| DELETE | - | id指定 | 削除時 |

#### sales_channel_domain

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | url, language_id, currency_id, snippet_set_id, sales_channel_id | 入力値 | ドメイン追加時 |
| UPDATE | url, language_id, ... | 入力値 | ドメイン更新時 |
| DELETE | - | id指定 | ドメイン削除時 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|--------------|----------|
| sw-sales-channel.notification.saveSuccess | 成功 | 保存しました | 保存成功時 |
| sw-sales-channel.notification.saveError | エラー | 保存に失敗しました | 保存失敗時 |
| sw-sales-channel.notification.deleteSuccess | 成功 | 削除しました | 削除成功時 |

## 例外処理

| 例外ケース | 処理内容 |
|-----------|---------|
| 必須項目未入力 | バリデーションエラーを表示 |
| ドメインURL重複 | エラー通知を表示 |
| 保存失敗 | エラー通知を表示 |
| 削除失敗 | エラー通知を表示 |

## 備考

- 販売チャネルタイプは拡張可能で、プラグインで新しいタイプを追加可能
- Storefrontタイプは通常のECサイト、HeadlessタイプはAPI専用
- 商品比較タイプはGoogle Shopping、idealo等への商品フィード出力用
- ドメイン設定はSSL、hreflangなどSEO関連設定も含む
- メンテナンスモードは許可IPリストを設定可能

---

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

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

### 推奨読解順序

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

販売チャネルエンティティの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SalesChannelDefinition | `src/Core/System/SalesChannel/SalesChannelDefinition.php` | 販売チャネルエンティティの定義 |
| 1-2 | SalesChannelDomainDefinition | `src/Core/System/SalesChannel/Aggregate/SalesChannelDomain/SalesChannelDomainDefinition.php` | ドメイン設定 |

**読解のコツ**: SalesChannelは多くの関連エンティティを持ち、言語、通貨、国、支払方法、配送方法などをManyToMany関連で持つ。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.js | `src/Administration/Resources/app/administration/src/module/sw-sales-channel/index.js` | モジュール登録、ルート定義 |

**主要処理フロー**:
1. **74-180行**: `Module.register('sw-sales-channel', ...)` でモジュールを登録
2. **105-176行**: ルート定義（detail, create, list）

#### Step 3: 詳細画面コンポーネントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sw-sales-channel-detail/index.js | `src/Administration/Resources/app/administration/src/module/sw-sales-channel/page/sw-sales-channel-detail/index.js` | 詳細画面コンポーネント |

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

```
sw-sales-channel-detail (Vue Component)
    │
    ├─ 販売チャネル取得
    │      └─ salesChannelRepository.get()
    │             └─ Shopware API (GET /api/sales-channel/{id})
    │
    ├─ 販売チャネル保存
    │      └─ salesChannelRepository.save()
    │             └─ Shopware API (PATCH /api/sales-channel/{id})
    │
    └─ 販売チャネル削除
           └─ salesChannelRepository.delete()
                  └─ Shopware API (DELETE /api/sales-channel/{id})
```

### データフロー図

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

販売チャネルID ─────────────▶ sw-sales-channel-detail
                                   │
                                   ├──▶ salesChannelRepository.get()
                                   │         │
                                   │         ▼
                                   │    Shopware API
                                   │         │
                                   │         ▼
                                   └──▶ salesChannel データ ──▶ フォーム表示

フォーム入力 ──────────────▶ sw-sales-channel-detail
                                   │
                                   ├──▶ salesChannelRepository.save()
                                   │         │
                                   │         ▼
                                   └──▶ 保存結果 ──▶ 成功/エラー通知
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.js | `src/Administration/Resources/app/administration/src/module/sw-sales-channel/index.js` | ソース | モジュール定義 |
| sw-sales-channel-detail/index.js | `src/Administration/Resources/app/administration/src/module/sw-sales-channel/page/sw-sales-channel-detail/index.js` | ソース | 詳細画面コンポーネント |
| sw-sales-channel-detail-base/index.js | `src/Administration/Resources/app/administration/src/module/sw-sales-channel/view/sw-sales-channel-detail-base/index.js` | ソース | 基本設定タブ |
| sw-sales-channel-detail-domains/index.js | `src/Administration/Resources/app/administration/src/module/sw-sales-channel/component/sw-sales-channel-detail-domains/index.js` | ソース | ドメイン管理 |
| sw-sales-channel-menu/index.js | `src/Administration/Resources/app/administration/src/module/sw-sales-channel/component/structure/sw-sales-channel-menu/index.js` | ソース | サイドメニュー |
| acl/index.js | `src/Administration/Resources/app/administration/src/module/sw-sales-channel/acl/index.js` | ソース | 権限定義 |
