コンテンツにスキップ

セット商品プラグイン

目的

  • 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 つあたりの構成数量(整数)

責務境界

  • セット商品そのものは、親 ProductVariantcustomFields.setComponents を正本にします。
  • セット商品一覧 / 特設導線は、必要に応じて Collection で表現します。
  • セット商品であることの識別は、product-type=set Facet の付与を推奨します。
  • Policy / Campaign の対象指定では、セット親も独立の bundleProduct 型ではなく productVariantIds に含めて扱います。

挙動(Shop / 顧客に見える世界)

  • カート、注文完了、購入履歴、注文メール、帳票では セット親の行のみ を表示します。
  • 在庫は 構成品側 で引き当て/減算します(セット親は在庫追跡を行いません)。
  • 購入制限(例: 上限、最小数量など)は、単体購入数量 + セット構成品としての数量 を合算して判定します。

SMILE 連携出力

  • SMILE への出力は 構成品の行のみ(A+B+C)を出力し、セット情報は出力しません。

セット商品構成の編集(Vendure Dashboard)

商品バリアント詳細画面に 「セット商品構成」ブロックを追加しています。

  • 構成品は SKU/名称で検索して追加できます。
  • 構成数量を入力して保存すると、customFields.setComponents が更新されます。
  • 構成品を 1 件以上保存した場合は、セット商品の前提を崩さないよう 在庫追跡(trackInventory)を自動で FALSE に更新します。
  • バンドル商品詳細では 代表画像を 1 枚設定できます。保存先は ProductVariant.featuredAsset / assetIds です。
  • 構成品をすべて外して保存した場合は、customFields.setComponentsnull に戻し、通常商品として扱います。
  • バンドル商品一覧は setComponentsnull でも空文字でもない商品だけを表示します。過去データに空文字が残っていても一覧に混ざらない想定です。
  • 一覧/詳細の「解除」は setComponentsnull に戻す操作であり、空文字での解除は行いません。

Storefront の画像表示ルール

  • バンドル商品に 代表画像が設定されていれば、Storefront の一覧・詳細ではその画像を表示します。
  • 代表画像が 未設定 の場合は、構成品の代表画像を使って 2x2 グリッド(最大4枚、超過は +N でフォールバック表示します。
  • 構成品側にも画像が無い場合は、通常のプレースホルダー表示にフォールバックします。