セット商品プラグイン¶
目的¶
- SMILE からインポートされる通常商品(商品番号=SKU)をベースにしつつ、Vendure 側で セット商品 を定義できるようにします。
- 顧客(Storefront・帳票)には 「セット商品×数量」 として見せます。
- 内部的には 構成品(商品番号=SKU)へ分解して扱い、在庫減算・購入制限判定・SMILE 連携出力を行います。
データモデル(Vendure)¶
- セット商品の定義は、商品バリアント(ProductVariant)のカスタムフィールド
setComponentsに保存します。 - バンドル商品の代表画像は、商品バリアント(ProductVariant)の既存 Asset リレーション
(
featuredAsset/assetIds) を使って保持します。 setComponentsは JSON 文字列で、以下の形式を想定します(管理画面から自動生成されます)。
{
"components": [
{ "productCode": "00030048", "quantity": 2 },
{ "productCode": "00010001", "quantity": 1 }
]
}
用語:
productCode: 構成品の 商品番号(=SKU)quantity: セット 1 つあたりの構成数量(整数)
責務境界¶
- セット商品そのものは、親
ProductVariantとcustomFields.setComponentsを正本にします。 - セット商品一覧 / 特設導線は、必要に応じて Collection で表現します。
- セット商品であることの識別は、
product-type=setFacet の付与を推奨します。 - Policy / Campaign の対象指定では、セット親も独立の
bundleProduct型ではなくproductVariantIdsに含めて扱います。
挙動(Shop / 顧客に見える世界)¶
- カート、注文完了、購入履歴、注文メール、帳票では セット親の行のみ を表示します。
- 在庫は 構成品側 で引き当て/減算します(セット親は在庫追跡を行いません)。
- 購入制限(例: 上限、最小数量など)は、単体購入数量 + セット構成品としての数量 を合算して判定します。
SMILE 連携出力¶
- SMILE への出力は 構成品の行のみ(A+B+C)を出力し、セット情報は出力しません。
セット商品構成の編集(Vendure Dashboard)¶
商品バリアント詳細画面に 「セット商品構成」ブロックを追加しています。
- 構成品は SKU/名称で検索して追加できます。
- 構成数量を入力して保存すると、
customFields.setComponentsが更新されます。 - 構成品を 1 件以上保存した場合は、セット商品の前提を崩さないよう 在庫追跡(trackInventory)を自動で FALSE に更新します。
- バンドル商品詳細では 代表画像を 1 枚設定できます。保存先は
ProductVariant.featuredAsset/assetIdsです。 - 構成品をすべて外して保存した場合は、
customFields.setComponentsを null に戻し、通常商品として扱います。 - バンドル商品一覧は
setComponentsが null でも空文字でもない商品だけを表示します。過去データに空文字が残っていても一覧に混ざらない想定です。 - 一覧/詳細の「解除」は
setComponentsを null に戻す操作であり、空文字での解除は行いません。
Storefront の画像表示ルール¶
- バンドル商品に 代表画像が設定されていれば、Storefront の一覧・詳細ではその画像を表示します。
- 代表画像が 未設定 の場合は、構成品の代表画像を使って
2x2 グリッド(最大4枚、超過は
+N) でフォールバック表示します。 - 構成品側にも画像が無い場合は、通常のプレースホルダー表示にフォールバックします。