🧪 これは比較用のモックです。distributor.html はまだこの形になっていません。データはダミー。基準日は 2026/7/12(日)。 受注一覧の3案モック → いまの流通PF →
販売設定 ── 期間が外枠、日別が内側
📏 売り枠は2段。すべての商品が「期間」を持ち、日ごとの上限が要る商品だけ「日別」をぶら下げる
「日別型の商品/期間型の商品」という区別は持ちません。運用でどちらを使うかが変わるだけです(決定メモ D21)。
例期間の販売上限数 日別の販売上限数実質の制約
ほうれん草(日持ちしない)常時・上限なしあり日別
玉ねぎ(保管品)7/13〜8/13・900なし期間の上限
じゃがいも(両方)7/15〜8/31・400あり(30/日)両方
ギフト直送7/20〜8/10・300— 直送は持たない期間の上限

日持ちする商品に日別だけを持たせると同じ在庫を月・水・金で3回売れてしまいますが、期間の販売上限数が外側にあるので防げます。 sales_offer_daily は倉庫経由のSKUだけ──日別上限は「その日に倉庫から出せる量」という在庫由来の制約なので、在庫を持たない直送SKUには対応するものがありません。
注文を受ける期間(締切)は持ちません。当面は商品名の右の公開ON/OFFで運用します(D24)。

🗓 この画面で使う日付は2つです。取り違えないでください
① 売り枠 = お届けできる期間

お客さまに届く日。倉庫経由は出荷日で保持していますが、表示のときにリードタイムを足してお届けベースに直しています。 期間は数週間あるので、販売先ごとのLT差(0〜2日)は誤差として飲みます(D24)。

② 日別の販売上限数 = 出荷日

倉庫からモノが出る日。こちらは換算しません。「その日に倉庫から出せる量」という日ごとの制約が本体なので、 お届け日に直すと意味が壊れます。お客さまに届くのは 0〜2日あとです。

① 売り枠 ── 1行=1商品(SKU)

すべての商品がここに出ます。倉庫経由も直送も同じ列で並びます(日付を「お届けできる期間」に揃えたため)。 見るのは「あといくつ売れるか」の一点。

※ 「常時」= from_date/to_date が NULL。期間の販売上限数を置かず、日別だけで運用している商品です。 ※ 「新米」は在庫が無いのに期間枠の例(予約販売)。期間枠=在庫引当ではありません。いまは非公開にしてあります。

② 日別の販売上限数 ── 商品 × 出荷日

①で「日別あり」にした商品だけが並びます。1セルは 受注数 / 販売上限数 の1行。入力するのは右(販売上限数)だけで、左は入っている受注数です。 見込(在庫+入荷予定)は販売上限数と違うときだけ小さく上に出ます。同じ数字を2つ並べても情報が増えないためです。 ①で設定した期間の外は塗られて入力できません——これが「期間が外枠」の見え方です。

10 / 20 受注数 / 販売上限数。入力するのは右(販売上限数)だけ 見込=在庫+入荷予定。販売上限数と違うときだけ出る 販売上限数が見込を超えている/受注が販売上限数を超えている 売り枠の期間外

※ じゃがいもの売り枠は 7/15 出荷からなので、7/13(月)が期間外で塗られます。 ※ 実際のグリッドは2週ぶん(14列)ですが、モックは読みやすさのため1週にしています。

出荷日1本が、販売先ごとに違う納品日になります(1販売先=1届け先なので LT は販売先の属性1つ)。

データ構造

生産者と倉庫/直送は product に。売り枠は sales_offer(期間の販売上限数)と sales_offer_daily(出荷日・上限)の親子2テーブル。

product ── 束ねて売る/倉庫経由
product
  id            P01
  item / spec / count_by / base_weight_kg
  supplier_id   NULL        ← 束ねて売る
  fulfillment   倉庫        ← 在庫と出荷可能を持つ
product ── 指名SKU/直送
product
  id            P30
  item / spec / count_by / base_weight_kg
  supplier_id   PR4  海辺やさい組合
  fulfillment   直送        ← 在庫も出荷可能も持たない
sales_offer ── 期間の売り枠(親)
sales_offer
  id            SO-3
  product_id    P21a  じゃがいも(北山)
  is_published  true          ← 公開ON/OFF
  from_date     2026-07-15    ← 倉庫なので出荷日
  to_date       2026-08-31       (画面はお届けに換算)
  offer_qty     400           ← 期間ぜんぶの販売上限数
  unit_price    210

  ※ 常時なら from_date / to_date は NULL
  ※ 期間では絞らないなら offer_qty は NULL
sales_offer_daily ── 日別の販売上限数(子)
sales_offer_daily
  id              SOD-11
  sales_offer_id  SO-3
  ship_date       2026-07-15  ← 出荷日(換算しない)
  cap_qty         30

sales_offer_daily
  sales_offer_id  SO-3
  ship_date       2026-07-17
  cap_qty         30

  ※ 倉庫経由のSKUだけが持つ

残の計算は2本。期間の販売上限数なら offer_qty − 期間内の受注済合計、日別なら cap_qty − その出荷日の受注済。両方あれば両方効きます。
sales_offer は supplier_id も fulfillment も持ちません(どちらも product で決まる=D23)。 受注締切も持ちません(is_published の ON/OFF で運用=D24)。

まだ決めていないところ

⚠️ 期間の表示と、日別グリッドの端がズレます
①で「お届け 7/13 〜 8/15」と出している玉ねぎは、内部では出荷日 7/13〜8/13 で持っています(LT 0〜2日を足して表示)。 ところが②の日別グリッドは出荷日なので、8/13 で終わります。同じ枠なのに端の日付が2日違って見える。
いまは②の期間外を塗ることで範囲を示し、①の期間欄に小さく出荷期間を併記していますが、これで足りるかは見てからの判断です。
⚠️ 出荷日の列は、ほぼ毎日立ちます
このモックは倉庫の出荷日を月・水・金に置いていますが、それだと下のカードのとおり やおや量販センター(LT2)の納品が日曜に落ちます。逆から考えると、販売先の納品曜日が月水金で固定なら必要な出荷日は 納品曜日 − LT なので──
LT0 の販売先 → 月・水・金 に出荷
LT1 の販売先 → 日・火・木 に出荷
LT2 の販売先 → 土・月・水 に出荷
結局ほぼ毎日、出荷日の列が立ちます。いまの販売設定は納品曜日以外を灰色で潰していますが、出荷日軸ではそれができません。列数と見せ方の判断が要ります。
プログレスバーは置きません。販売上限数は入荷のたびに人が動かす数字なので、分母が固定されません。
販売上限数900・受注200 → 22% 塗られる
   ↓ 入荷したので販売上限数を1200に更新
販売上限数1200・受注200 → 17%   ← 何も取り消していないのにバーが戻る
逆に販売上限数を減らすとバーが進みます。進捗として読めるものにならないので、数字だけにしました。 「あといくつ」が大きく出ていれば、埋まり具合は 受注 640 / 販売上限数 900 の並びで足ります。
受注締切は当面持ちません(D24)。一般的なECの「販売期間」は注文を受け付ける期間を指し、届く日は「発送目安」や「お届け日指定」として別建てになっています。 その流儀に寄せるなら受注期間を主軸にすべきですが、まずは公開ON/OFFの運用で足りるか見ることにしました。 足りなくなったら、絶対日(ギフト「7/19まで」)と相対ルール(「出荷2日前まで」)の2種類をどう持つかを決めます。
採らなかった案。①「日別型の商品/期間型の商品」を商品マスタで振り分ける(shelf_life_days 等)… 混在する商品があると破綻するうえ、ユーザーから見て「この商品はどっちの設定画面か」を覚える必要が出る。期間を必ず持たせて日別を任意にすれば、その区別自体が要らない。 ②期間も出荷日で表示する… 直送は出荷日を持てないので、列の意味が行ごとに変わる。 ③期間・日別で別々の日付列を並べる(出荷/納品の2列)… どの行も片方が空欄になり、結局「この行はどっちを見るのか」が残る。 ④日別の販売上限数を sales_offer に持たせる(1レコード=1日)… 期間と日別の上限が同じ列を共有することになり、「この行は期間なのか日なのか」が読めない。親子2テーブルに分けた。
触っていないもの:単価。運賃を誰が持つかが未決(決定メモ)なので、unit_price を持つだけにしてあります。