Product stock management

🌐 言語: 🇻🇳 Tiếng Việt · 🇬🇧 English · 🇯🇵 日本語(現在)

GP247 のセット商品(Bundle / Combo)

はじめに

このドキュメントでは、GP247(バージョン 2 以降)の セット商品(bundle/combo) 機能を説明し、ストアオーナーが複数の 子商品からなるセット商品を自分で作る方法を案内します。技術に詳しくない方 向けです。読み終えると、セット商品と通常の 商品の違い、機能の有効化、セットの作り方、そして価格の決まり方と在庫の引き当て方がわかります。


1. セット商品とは? GP247 の 3 種類の商品

GP247 では、すべての商品が 3 つの種類(kind)のどれか 1 つ に属します。

種類 意味 販売できる? 価格 在庫
単品(Single) 単独で販売する通常の商品 はい その商品自身の価格 自身の在庫
セット / コンボ(Build) 1 つのパッケージ として販売する商品で、中に複数の 子商品 と数量が含まれる はい(通常の商品と同じ) セット自身の価格(あなたが設定) セット自身の在庫を持つ。販売すると各子商品の在庫が引き当てられる
グループ(Group) 陳列用にまとめる だけで、直接は販売しない いいえ なし(価格ではなく文言を表示) 管理しない

セット商品とは「セット / コンボ(Build)」のことです。 例:「テト(旧正月)のギフトセット」= お菓子 1 箱 + 飲み物 2 本 + 紙袋 1 枚。お客様が 1 セット 買うと、システムが自動で在庫を引き当てます:お菓子 1 箱、飲み物 2 本、紙袋 1 枚。

いちばん大切なポイント:

  • セットの価格は あなたがセットに設定した価格 です。GP247 は子商品の価格を自動で 合計しません。セットの価格は あなたが決めます(お客様に魅力的になるよう、単品で買うより安くするのが一般的です)。
  • 1 セット売れると、セットに登録した数量に応じて 各子商品の在庫が引き当てられます。

2. セット商品の機能を有効にする

商品の種類分け(単品/セット/グループ)は、設定のスイッチで制御されます。スイッチがオフだと すべての商品が単品 になり、 セットを作る選択肢は 表示されません。

  1. 管理画面(admin) にログインします。

  2. ショップ設定(Shop Configuration)を開きます。

  3. 商品の構成タイプの項目を探します(設定キーは product_kind、ラベルは「構成タイプを使用(単品、グループ、セット)」です)。

  4. この項目を オン にして保存します。

    成功すると、商品の追加/編集フォームを開いたときに 商品の種類 を選ぶ部分が表示され、単品、セット(Build)、 グループ(Group)の 3 枚のカードが並びます。

後でこのスイッチをオフにすると、商品は単品として扱われ、種類の選択部分は非表示になります(以前のセットのデータは データベースに残り、選択肢が表示されないだけです)。


3. セット商品(Bundle)を作る手順

準備:子商品(例:お菓子の箱、飲み物のボトルなど)は、単品の商品として先に作っておくのがおすすめです。セットに 組み込むとき、名前/SKU で検索するためです。

  1. 商品(Product) → 新規追加 を開きます。

  2. 商品の種類 の部分で、セット(Build) のカードを選びます。

  3. 通常の商品と同じように基本情報を入力します:名前、SKU、価格(セット全体の販売価格)、セットの 在庫、 説明など。

  4. 構成 / Composition タブを開きます(このタブは種類がセットまたはグループのときだけ表示されます)。

  5. 検索欄に子商品の 名前またはコード(SKU) を入力し、候補一覧から選んで追加を押します。

  6. 追加した子商品ごとに、セットに含まれる 数量 を入力します(例:飲み物 2 本)。すべての子商品について繰り返します。

  7. 保存 を押します。

    成功すると、セット商品が商品一覧に表示されます。構成タブを開き直すと、すべての子商品と数量が表示されます。

ヒント:セットはいつでも編集できます。子商品の追加/削除や数量の変更をして、もう一度保存します。古い子商品の一覧は、 新しい一覧で上書きされます。


4. セット商品の価格と在庫

  • 価格: あなたがセットに入力した価格 です(通常の商品と同じく特価も設定できます)。GP247 は子商品の価格を自動で 合計しません。セットの価格は完全にあなたが決めます。
  • 販売時の在庫: お客様が N セット 買うと、システムは次のように引き当てます。
    • セット の在庫から N、
    • 各子商品 の在庫から N × (セット内の子商品の数量)。
    • 例:セットに飲み物が 2 本入っていて、お客様が 3 セット買った場合 → 在庫から飲み物 6 本が引き当てられます。
  • 特価: セット商品にも適用できます(単品と同じです)。
  • 属性/バリエーション(サイズ、色など): セット商品では 使えません。バリエーションは単品の商品専用です。

在庫についての注意:1 セット売れると子商品の在庫が減るため、子商品の在庫が十分にあるか確認してください。子商品の 1 つが 在庫切れになったら、セットの在庫も適切か見直してください。


5. セット商品はお客様にどう表示されますか?

  • 商品詳細ページ(ストアフロント)では、セット商品に 「Bundle」ブロック が表示され、子商品が並びます:画像、 各子商品の 数量、子商品の名前、そして「セットは A + B + C で構成」を表す + 記号です。
  • お客様は 通常の商品と同じようにカートに追加して購入 します(子商品を 1 つずつ選ぶ必要はありません)。
  • 表示される価格は セットの価格 です。

グループ(Group) との違い:グループには購入ボタンがなく、所属する商品を表示してお客様がクリックで移動できるだけです。 販売できるセットではありません。


6. 技術的な詳細(開発者向け)

このセクションは 開発者 向けです。一般のユーザーは読み飛ばしてかまいません。

商品の種類の定数 — vendor/gp247/shop/src/Library/Const.php:

define('GP247_PRODUCT_SINGLE', 0);
define('GP247_PRODUCT_BUILD', 1);   // bundle/combo
define('GP247_PRODUCT_GROUP', 2);

shop_product.kind 列に保存されます。

データテーブル

  • shop_product_build — セット→子商品の関係:build_id(親セットの id)、product_id(子商品の id)、quantity (子商品の数量、decimal(15,2))、複合主キー (build_id, product_id)。
  • shop_product_group — グループ→メンバーの関係:group_id、product_id(複合主キー)。quantity 列はありません (Build と異なります)。

モデルとリレーション(ShopProduct)

  • builds() → hasMany(ShopProductBuild, 'build_id', 'id')。各要素は ->product(子商品)と ->quantity を持ちます。
  • groups() → hasMany(ShopProductGroup, 'group_id', 'id')。
  • ShopProductBuild::product() / ShopProductGroup::product() → belongsTo(ShopProduct, 'product_id')。

価格と在庫(ShopProduct)

  • getFinalPrice() — 親商品自身の価格(または特価)を返し、子商品の価格は 合算しません。
  • updateStock($productId, $qtyChange) — 親の在庫を引き当てます。kind == GP247_PRODUCT_BUILD の場合は builds を ループし、各子商品の在庫を qtyChange × build->quantity だけ引き当てます。
  • allowSale() — Group を販売対象から除外します(kind != GP247_PRODUCT_GROUP)。

管理画面(Livewire ProductManager + トレイト HasProductComposition)

  • 種類の選択部分は gp247_config('product_kind') で制御されます。= 0 のときは選択部分を隠し、kind = SINGLE に固定します。
  • persistComposition() — builds()->create(['product_id','quantity'])(または groups()->create([...]))の行を すべて削除してから作り直します。
  • 「composition」タブは kind が Build/Group のときだけ有効になり、「variants」タブは Single のときだけ有効になります。

ストアフロント — shop_product_detail.blade.php:Bundle ブロックは $product->builds をループし、数量のバッジには gp247_qty_format($build->quantity) を使います。


よくある質問(Q&A)

Q1: 商品を作成するとき、「セット(Build)」の種類を選ぶ場所が見当たりません。

→ 先にショップ設定で product_kind を有効にする必要があります(セクション 2 をご覧ください)。オフの場合、すべての商品は 既定で単品になり、種類の選択部分は非表示になります。

Q2: セットの価格は子商品の価格から自動で合計されますか?

→ いいえ。セットの 価格はあなたが設定します。GP247 は自動で合計しません。セットの価格は完全にあなたが決めます。

Q3: お客様が 1 セット買うと、在庫はどう引き当てられますか?

→ セットの在庫から 1 が引かれ、各子商品 の在庫から登録した数量が引かれます(例:飲み物 2 本入りのセット → 2 本を引き当て)。

Q4: セット(Build)とグループ(Group)は何が違いますか?

→ Build は価格があり、子商品の在庫を引き当てる 販売できるセット です。Group は 陳列用にまとめる だけで、販売せず、 価格もなく、カートにも追加できません。

Q5: セット商品に属性(サイズ、色)を割り当てられますか?

→ できません。属性/バリエーションは単品の商品専用です。セットではバリエーションを使いません。

Q6: 子商品は先に作る必要がありますか?

→ 先に作っておくのがおすすめです。セットに組み込むとき、子商品を名前/SKU で検索するためです。子商品(単品)を先に作ってください。

Q7: セットに特価を設定できますか?

→ できます。セット商品は単品の商品と同じように特価を使えます。

Q8: セットを編集(子商品の追加/削除、数量の変更)できますか?

→ できます。セット商品を開き、構成タブで調整してから保存します。古い子商品の一覧は新しい一覧に置き換えられます。

Q9: 子商品の 1 つが在庫切れになっても、セットは販売できますか?

→ システムは販売時に子商品の在庫を引き当て続けます。在庫数を超えて売らないよう、各子商品の在庫とセットの在庫を実際の 在庫に合わせておくことをおすすめします。

Q10: セットを作った後で product_kind をオフにするとどうなりますか?

→ 商品は単品として扱われ、種類の選択部分は非表示になります。以前のセットのデータはデータベースに残っており、フォームに 種類の選択肢が表示されなくなるだけです。


📅 最終更新: 2026-10-22 · ✍️ 作成者 (Author): GP247