Data Model
テーブル構造
sot.products (商品マスター)
├─ id (uuid) PK
├─ shop + barcode (UNIQUE) ← 受注・在庫との結合キー
├─ product_name, sku, variant_name, brand, category_l1/l2/l3
├─ current_price, current_compare_at_price, current_cost, currency
├─ is_non_inventory (非在庫サービス品フラグ。true はルーティング引き当て対象外 → serviceLines)
├─ is_accessory_service (付帯サービス。現物の無い明細。true は必ず is_non_inventory=true)
├─ inventory_push_disabled_source_ids (この商品の在庫連携を止めた出荷元の拠点 id。その出荷元の出荷元在庫の通知は 0 になる)
│
├──< sot.product_update_logs (変更ログ)
│ └─ change_type: created / updated (+ changed_fields)
│
└──< sot.inventory_levels (在庫)
├─ product_id FK → products.id
├─ location_id FK → locations.id
├─ on_hand_qty, available_qty, committed_qty, allocated_qty, reserved_qty, incoming_qty
│ (ルーティング引き当ては routable = available_qty + committed_qty で判定)
├─ held_qty (取り置き合計) / available_qty_gross (取り置き前の取込値。取り置きのある行だけ)
├─ channel_available_qty / channel_available_as_of (販売チャネルでの販売可能数。外部倉庫の拠点で 0 以下なら available_qty = 0)
│ available_qty = greatest(0, 取込値 − held_qty)。available_qty 更新時にトリガで引き直す
│
├──< sot.lm_inventory_holds (取り置き台帳)
│ └─ UNIQUE (shop, reference_id, location_id, product_id) / quantity>0 / expires_at (任意)
│
└──< sot.inventory_update_logs (変更ログ)
└─ change_type: snapshot / available_set / available_delta / committed_set / on_hand_set
sot.locations (拠点マスター)
├─ id (uuid) PK
├─ display_label, location_type, region
└─ ec_fulfillable, is_active
sot.order_line_master (受注 / 1 row = 1 販売単位)
├─ barcode ──結合──> products.barcode
├─ channel_id ──> channels.id, location_id ──> locations.id
└─ net_amount_taxincl, tax_amount, refund_amount, ...
sot.inventory_daily_snapshots (日次スナップショット)
└─ snapshot ingest が当日行を upsert + 日次 rollup cron で確定
sot.lm_stocktake_sessions (棚卸セッション。LM-2467)
├─ 拠点ごとに進行中 (counting / submitted) は 1 つ (部分 UNIQUE) / mode=shelf (MFC の棚ごと) | location (店舗・拠点全体。LM-2476) / status: counting → submitted → committed | cancelled
├──< sot.lm_stocktake_shelves (数える棚。PK (session_id, shelf_code) / status counting|closed / started_at / movement_detected / recount_no)
└──< sot.lm_stocktake_counts (計数 = 棚 × 商品 × 状態)
├─ 有効行で UNIQUE (session_id, shelf_code, product_id, condition_code) (superseded_at IS NULL)
├─ counted_qty (数えた数。帳簿にあるが読まれなかった商品は 0) / expected_qty (棚を締めた時点の帳簿数)
├─ superseded_at (再計数で置き換えた旧行) / applied_at / applied_delta / apply_error_kind (counted_below_active | negative_after_delta)
└─ 反映は差分 (counted − expected) を lm_shelf_inventory / lm_shelf_condition_stock に当て、lm_shelf_inventory_logs に reason=stocktake + stocktake_session_id
├──< sot.lm_stocktake_location_lines (mode=location の商品ごとの行。提出で固定。LM-2476)
│ ├─ UNIQUE (session_id, product_id) / counted_good_qty / counted_other_qty (記録のみ)
│ ├─ book_on_hand_qty (取り込み元の生の在庫数 inventory_levels.on_hand_qty) + allocated_unsecured_qty (allocated で未確保の unit) = expected_qty
│ ├─ movement_detected (window_start 以降に inventory_update_logs か unit が動いた) / applied_at / applied_delta / apply_error_kind (moved_while_counting)
│ └─ write_back: adjustment (下の調整を作った) | record_only (inbound_only / 外部 ID なし) | none (差 0)
└──> sot.lm_inventory_external_adjustments (外部システムへ当てる差分 = 相対値。LM-2476)
├─ UNIQUE (session_id, product_id) / connector (smaregi | shopify) / delta (<>0)
├─ status: pending → claimed → applied | failed | unknown (claimed のまま一定時間で再 claim・attempts++)
└─ claim / result は /api/routing/inventory-adjustments/* (x-ingest-secret)。lm-os は外部 API を知らない
read view: agent_read.stocktake_sessions / stocktake_shelves / stocktake_counts (delta = counted − expected) / stocktake_location_lines / inventory_external_adjustments
sot.inventory_condition_codes (商品状態のマスタ。LM-1207 → LM-2466 で棚 × 状態の数の軸に)
├─ PK (shop, code)。is_default = 良品 (shop に 1 つ・既定 A) / allocatable_default (表示メタ。引当は見ない)
├─ seed A(default)/B/C/UNKNOWN。locations AFTER INSERT トリガで新規 shop に自動 seed (LM-1212)
└─ 良品以外の数は sot.lm_shelf_condition_stock (棚 × barcode × 状態)。旧 inventory_balances (available の内訳) は LM-2475 で撤去
sot.inventory_ledger (取り置きの履歴 append-only / 真実源ではない)
└─ event_type = hold・release (LM-2019)。旧 classify / block_release は LM-2475 で書き手ごと撤去
read view: agent_read.inventory_condition_codes / inventory_ledger
sot.lm_fulfillment_source_members (出荷元 → 在庫ロケーション 紐付け / 1:N)
└─ UNIQUE (shop, inventory_location_id) ← 在庫ロケーションは1出荷元のみ
出荷元の合算 available_qty = member 在庫ロケーションの available_qty 合算
sot.lm_fulfillment_source_webhook_config (出荷元の合算在庫変動 webhook 送信設定)
└─ UNIQUE (shop, fulfillment_source_location_id) / auth_secret_encrypted = pgcrypto暗号化 (鍵=Vault)
sot.lm_fulfillment_source_inventory_state (出荷元×product ごとの前回送信した合算値 = dedup)
└─ UNIQUE (shop, fulfillment_source_location_id, product_id)
sot.lm_fulfillment_source_inventory_events (合算変動イベント outbox + 送信ログ / secret なし)
└─ delivery_status: pending / sent / failed / skipped
sot.lm_routing_orders (受注ルーティングの注文ヘッダ / routing-native)
├─ UNIQUE (shop, source_system, external_order_ref) ← 入口冪等
├─ status: received / routed / dispatched / failed / no_stock / cancelled
├─ tag (ディスパッチ先選択条件)
├─ 詳細配送先 ship_to_name/company/phone/email/address1/address2 は PII
│ → 公開 view lm_v_routing_orders からは除外 (service_role 直のみ)
│ = 出荷ラベル宛先住所の単一ソース。住所修正で更新 + ship_to_corrected_at/by 監査
├─ ship_to_email_norm = lower(btrim(ship_to_email)) の生成列 (顧客注文照会 API の突合キー。
│ PII のため公開 view / agent_read に出さない)
│
├──< sot.lm_routing_order_ship_to_changes (宛先住所・氏名の変更履歴 / append-only)
│ ├─ before / after = 変更前後の宛先住所スナップショット (PII) / changed_fields = 変更項目
│ ├─ changed_by_staff_user_id (operator JWT 経由) / changed_by (correctedBy) / changed_at
│ └─ service_role 専用 (公開 view / agent_read 非公開)。値が変わったときだけ 1 行 append
│
├──< sot.lm_routing_decisions (unit 単位の判定結果, decision_status=applied)
│ ├─ fulfillment_source_location_id=指定出荷元 / selected_location_id=引き当て先在庫ロケーション
│ ├─ line_properties = 明細単位の任意キー/値 (routing lines[].properties。刻印等
│ │ PII になり得るため agent_read 非公開)
│ ├─ oversold / superseded_by_decision_id ← 売越し・再引き当て
│ ├─ oversold_by_staff_user_id / created_by_staff_user_id (operator JWT 経由の操作者。機械間 secret 経由は NULL)
│ └──< sot.lm_routing_candidates (拠点別スコア snapshot / 除外理由)
│ └─ available_qty_at_decision / committed_qty_at_decision = 判定時の在庫 split
│
└──< sot.lm_shipping_instructions (出荷指示 dispatch ログ)
└─ UNIQUE (shop, idempotency_key) ← 出口冪等
delivery_status: pending / sent / failed / skipped
sot.lm_location_dispatch_config (在庫ロケーション単位の WMS 送信設定)
└─ UNIQUE (shop, location_id, tag, action) / auth_secret_encrypted = pgcrypto暗号化 (鍵=Supabase Vault)
tag=NULL は既定 / action=create|update|cancel|label|print。解決は action 完全一致 + tag 一致優先
sot.lm_wms_shipping_requests (WMS 出荷指示 SHIPPING_REQUEST の送信記録。/api/routing/wms-shipping-request)
└─ mode: shadow|live / status: shadow|pending|success|error
instruction = 受け取った出荷指示 (倉庫ベンダー非依存の中立モデル)
request_payload = 倉庫へ実際に送った本文 (様式変換は送信 app 側)
いずれも配送先・請求先 PII を含むため view 非公開・service_role 専用
label/print の解決キーは出荷元 (fulfillment source location)
sot.lm_location_dispatch_log (WMS 送信ログ / delivery_status, secret は含まない)
sot.lm_location_star_printers (在庫ロケーション → Star プリンター device ID 紐付け)
└─ UNIQUE (shop, location_id) ← 1 ロケーション 1 プリンター
sot.lm_external_sku_mappings (外部システム SKU ↔ barcode の明示マッピング)
└─ UNIQUE (shop, system, external_sku) / is_active / notes
人間レビュー済みの登録のみ (SKU 名からの自動マッピング禁止)。system 例 'amazon_mcf_us'
消費者 = fulfill-job の sellerSku 解決 + GET /api/ingest/sku-mappings の読み取り
sot.lm_fulfillment_shipments (出荷元ヘッダ = 梱包単位 / 注文 × from_location)
├─ UNIQUE (shop, routing_order_id, from_location_id)
├─ status: allocated → secured → in_transit_to_mfc → packing → shipped (+ oversell_*)
├─ tracking_number / carrier_code / label_pdf_path (ラベルは梱包単位に1つ)
├─ external_fulfillment_id / external_fulfillment_accepted_at (外部フルフィルメント発注の受理マーカー
│ = fulfill-result が記録。fulfill-job の再発注 skip / fulfill-pending の走査対象判定)
├─ last_label_error (発行失敗のキャリア応答 → 住所修正 + retry-label でリカバリ)
├─ label_printed_at / last_print_error (出荷元 print server への物理印刷結果 → print-label で再印刷)
├─ label_retried_by_staff_user_id / label_printed_by_staff_user_id
│ (operator JWT 経由でラベル再発行 / 手動再印刷を実行したスタッフ。機械間 secret 経由は NULL)
├─ status_reported_by_staff_user_id
│ (operator JWT 経由で出荷ステータス遷移を報告したスタッフ。機械間 secret 経由は NULL)
│
└──< sot.lm_fulfillment_units (1 row = 1 販売単位 / order_line_master 方式・数量列なし)
├─ barcode / sku / line_instance_no, routing_decision_id へリンク
├─ line_properties (明細単位の任意キー/値。decision から非正規化, agent_read 非公開)
├─ allocated_location_id(引当) / fulfillment_source_location_id(出荷元)
├─ current_inventory_location_id(現在在庫・店舗→MFCで更新)
├─ status (ヘッダと同10値) / secured (在庫確保フラグ)
│
├─ picked_at / picked_by (MFC 内ピッキング完了 = 配送 status と直交の作業状態。
│ ユニットQR スキャンで更新。NULL = 未 pick。旧 mfc ready_for_pickup.status=picked 相当)
├─ secured_by_staff_user_id (operator JWT 経由で在庫確保したスタッフ。機械間 secret 経由は NULL)
│
├──< sot.lm_oversell_cases (売越し 8ステップ + wont_do)
│ ├─ found_location_id / tracking_number / external_shipment_ref / 各ステップ ts
│ ├─ opened_by_staff_user_id / updated_by_staff_user_id (operator JWT 経由の起票者 / 前進操作者。機械間 secret 経由は NULL)
│ (LM-498 の oversold フラグとは独立共存)
│
└──< sot.lm_fulfillment_source_changes (出荷元変更 + 返送レグ追跡)
├─ from/to_source_location_id (旧/新 出荷元) + from/to_inventory_location_id
├─ status: change_requested → return_in_transit → return_received (+ cancelled)
├─ return_tracking_number / return_label_pdf_path / reason / 各ステップ ts
├─ leg_mode: transfer (返送) / switch (出荷元だけ切替) / inbound (出荷元への入荷転送)
└─ batch_id ──> sot.lm_transfer_batches (倉庫間移動バルク。NULL = 未所属)
(出荷元そのものを切替。unit.status=source_change_pending/in_transit に連動)
sot.lm_transfer_batches (拠点間移動バルク)
├─ kind: return (出荷元→倉庫の返送。返送ラベルを発行する)
│ / inbound (現物を出荷元へ運ぶ入荷転送。既発行の便を追跡するだけ)
├─ from/to_location_id (送り側 / 宛先の出荷元)
├─ status: open → dispatched → received (inbound は登録時から dispatched)
├─ tracking_config_location_id / _tag (配送状況を引くときの設定の解決先)
├─ tracking_status / _raw_status / _checked_at / _last_event / _error (配送状況スナップショット)
└─ pdf_storage_path (内容物リスト PDF) / dispatched_at / received_at / created_by_staff_user_id
sot.lm_stock_transfers (拠点間 在庫移動 = 商品×数量の location→location 移動 / 返送バルクとは別物)
├─ origin/destination_location_id (出庫元 / 入庫先) + *_location_snapshot (削除耐性)
├─ 3 軸ステータス: progress (draft→pending_shipment→shipped→receiving→received / canceled)
│ / approval (none/pending_request/pending/approved/rejected)
│ / modification_request (none/requested/completed。requested は receiving 限定)
├─ origin/destination_kind (mfc_self/smaregi_store/shopify/other = 在庫効果の分岐ヒント)
├─ identification_no (伝票番号) / smaregi_shipping_id / shopify_inventory_transfer_gid (チャネル外部ID)
├─ UNIQUE (shop, idempotency_key) 冪等 / (shop, smaregi_shipping_id) / (shop, shopify_inventory_transfer_gid)
├─ CHECK: 自己移動禁止 / requested は receiving のみ / shipped は承認前(pending_request)不可
│ ★実数量が動くのは自己在庫(source_system='mfc_inventory_ingest')の拠点のみ (ship/receive で棚± + recompute)
│
├──< sot.lm_stock_transfer_lines (明細 = barcode × 数量)
│ ├─ request/quantity(計画)/shipped/received_accepted/received_rejected_quantity
│ ├─ origin/destination_shelf_code / shelf_ship_applied_qty / shelf_receive_applied_qty (棚±冪等マーカー)
│ ├─ UNIQUE (stock_transfer_id, barcode) / (stock_transfer_id, line_no)
│ └─ CHECK: shipped_quantity <= quantity (計画超の出庫を全 writer で禁止=売越防止)
│ / received_accepted + received_rejected <= shipped_quantity
│
├──< sot.lm_stock_transfer_modification_requests (入庫検品中の修正依頼)
│ └─ status: requested/completed/deleted / lines_snapshot / active(requested) は partial unique 1 件
│
└──< sot.lm_stock_transfer_shelf_logs (移動が自己在庫棚を±した attribution 追記ログ)
└─ reason: ship_out(出庫元−) / receive_in(入庫先+) / delta(<>0) / location_id / shelf_code
(棚在庫ログ本体 lm_shelf_inventory_logs とは別 = 単一真実源を破らない)
read view: agent_read.lm_stock_transfers (shopify_phase 派生 + line_count/total_quantity/received_quantity・PII なし)
/ agent_read.lm_stock_transfer_lines (barcode→products で sku/商品名付与)
sot.lm_shipment_memos (出荷メモ = shipment 単位の手書きメモ・追記のみ/監査ログ)
├─ shipment_id ──> sot.lm_fulfillment_shipments(id) (ON DELETE CASCADE)
├─ body (自由記述) / author_user_id / author_email (PII 相当 = service_role only・agent_read 非公開)
└─ created_at のみ (追記のみ = updated_at なし) / INDEX (shop, shipment_id, created_at DESC)
sot.lm_share_analytics_shares / _items / _events (店舗→EC送客 = 共有・共有商品・追跡イベント)
├─ 冪等 upsert キー: UNIQUE (source, source_share_id / source_item_id / source_event_id)
├─ PII は hash 列のみ (source_share_token_hash / staff_email_hash / line_user_hash / customer_hash)。
│ raw トークン・メール・LINE id・顧客 id は保存しない。order_id_reference のみ internal-only raw
├─ events.event_type CHECK: opened / line_pushed / line_liff_opened / product_click / add_to_cart / purchased
└─ FK なし (イベント先行着弾を許容) / service_role only・agent_read 非公開
sot.lm_fulfillment_status_webhook_config (出荷元ステータス変動 webhook 送信設定)
└─ UNIQUE NULLS NOT DISTINCT (shop, source_system)。source_system NULL = 既定宛先
/ auth_secret_encrypted = pgcrypto暗号化 (鍵=Vault, dispatch と共有)
sot.lm_fulfillment_status_events (status 遷移イベント outbox + 送信ログ / secret なし)
└─ status_before → status_after / tracking_number / delivery_status: pending / sent / failed / skipped
起票元 = lm_fulfillment_shipments.status の遷移 (routing-fulfillment が emit)
sot.lm_routing_allocation_webhook_config (引き当て暫定確定 webhook 送信設定)
└─ UNIQUE (shop) / auth_secret_encrypted = pgcrypto暗号化 (鍵=Vault, dispatch と共有)
sot.lm_routing_allocation_events (引き当て結果イベント outbox + 送信ログ / secret なし)
└─ allocation_status: allocated / unallocated + lines snapshot (barcode×properties 単位
+ sku/productName 同梱。properties は PII になり得るため公開 view では除去)
起票元 = routing 完了時の出荷指示 (routing-orders が emit)
sot.lm_routing_cancel_events (確保前キャンセルイベント outbox + 送信ログ / secret・明細なし)
└─ shipment_id 中心 (受信側の冪等キー) / 送信設定は lm_routing_allocation_webhook_config を再利用
起票元 = 確保前 (secured_at IS NULL)・未出荷の shipment キャンセル (routing-cancel が emit)
sot.lm_oversell_status_webhook_config (売越しケース受付完了 webhook 送信設定)
└─ UNIQUE (shop) / auth_secret_encrypted = pgcrypto暗号化 (鍵=Vault, dispatch と共有)
sot.lm_oversell_status_events (ケース受付完了イベント outbox + 送信ログ / secret なし)
└─ status = warehouse_received のみ / found_location_id + lines snapshot (barcode 単位
+ sku/productName 同梱・quantity=1) / UNIQUE (oversell_case_id) で二重発行防止
起票元 = lm_oversell_cases.status が warehouse_received へ遷移 (routing-oversell-case が emit)
sot.lm_order_update_webhook_config (受注情報更新 webhook 送信設定)
└─ UNIQUE (shop) / auth_secret_encrypted = pgcrypto暗号化 (鍵=Vault, dispatch と共有)
sot.lm_order_update_events (受注更新イベント outbox + 送信ログ / secret なし)
└─ change_type = address_corrected のみ (将来種別追加) / 修正後 ship_to snapshot (PII)
+ corrected_at / corrected_by / UNIQUE なし (1 修正 = 1 event)
起票元 = lm_routing_orders.ship_to_* が /api/routing/shipment/address で更新 (routing-shipment-address が emit)
ship_to (住所) は PII のため公開 read view を作らず service_role only
read view: lm_v_fulfillment_shipments / lm_v_fulfillment_units / lm_v_oversell_cases
/ lm_v_fulfillment_source_changes
/ lm_v_fulfillment_status_webhook_config(secret除外) / lm_v_fulfillment_status_events
/ lm_v_routing_allocation_webhook_config(secret除外) / lm_v_routing_allocation_events(lines の properties・request_payload 除外)
/ lm_v_oversell_status_webhook_config(secret除外) / lm_v_oversell_status_events(request_payload 除外)
/ lm_v_routing_order_fulfillment(ヘッダ粒度) / lm_v_routing_order_unit_fulfillment(単位粒度)
sot.lm_picking_lists (ピッキングリスト生成ログ / append-only)
└─ routing_order_id FK → lm_routing_orders.id / format / pdf_url(Storage) / payload(jsonb)
+ 集計 location_count / item_kinds / total_quantity / unpickable_count / generated_at
PDF は Storage bucket "picking-lists" (public read) に保存
sot.lm_shelf_links (棚コード ↔ fulfillment shipment 紐付け)
├─ location_id FK → locations.id / fulfillment_shipment_id FK → lm_fulfillment_shipments.id
├─ shelf_code (CHECK ^[A-Z0-9]+(-[A-Z0-9]+)+$ + 英字必須 + 32 文字以内)
├─ linked_by / linked_at / released_at / released_reason(shipped|manual_release|cancelled|source_changed)
│ 解除は DELETE せず released_at を埋める (行自体が履歴)
└─ partial unique index (released_at IS NULL): 同一棚 1 shipment / 同一 shipment 1 棚
sot.lm_shelf_inventory (棚在庫 / qty 集約)
├─ UNIQUE (shop, location_id, shelf_code, barcode) / qty >= 0
├─ 商品参照は barcode のみ (Shopify 非依存)。同一棚に複数 barcode 不可
├─ MFC 入庫 (/api/ingest/mfc-inventory) は (barcode × shelf_code) を mode=absolute(絶対値 set)
│ または mode=adjust(符号付き差分加減算) で反映し、同一トランザクションで barcode を全棚合算して
│ inventory_levels.available_qty を更新 (棚番号は MFC 引き当て時の Star ラベル印字に使用)
└─ /api/operator/shelf/pick の pick (picked_at 確定) で対象棚 qty を -1 (reason=pick) / unpick で +1
(reason=receive)、続けて available_qty を再計算 (LM-769。自己在庫 MFC のみ。出荷前に物理棚を実態へ)
sot.lm_shelf_inventory_logs (棚在庫 増減ログ / append-only)
└─ delta (<>0) / qty_after (>=0) / reason(receive|pick|adjust|oversell_receive|stocktake|relocate|condition_move) / operator / condition_code (NULL=良品) / stocktake_session_id
sot.lm_shelves (棚マスタ。LM-2466)
├─ UNIQUE (shop, location_id, shelf_code) / zone (売場 / バックヤードなどの区分) / is_active
└─ 棚在庫・状態別在庫に新しい棚が現れると AFTER INSERT トリガーで自動登録 (既存の入庫・集荷は登録を要求しない)
sot.lm_shelf_condition_stock (棚 × barcode × 商品状態の数。良品以外だけ。LM-2466)
├─ UNIQUE (shop, location_id, shelf_code, barcode, condition_code) / qty > 0 / FK (shop, condition_code) → inventory_condition_codes
├─ 良品 (shop の既定 condition) は lm_shelf_inventory。ここの数は販売可能数に入らない (引当対象外)
└─ 増減は lm_shelf_condition_move が lm_shelf_inventory_logs に condition_code 付きで記録 (reason=condition_move)
read view: lm_v_shelf_links / lm_v_shelf_inventory (内部 service / 管理用途。agent_read 非露出)
sot.lm_operator_staff_shops (倉庫スタッフ ↔ shop の operator API 認可束縛)
├─ staff_user_id (ユーザー) / shop (lower(btrim) 正規化) / is_active / UNIQUE (staff_user_id, shop)
└─ /api/operator/* の shop 認可 SoT。失効は論理 (is_active=false / revoked_at)
staff_email 等の個人情報を含むため service_role 限定・agent_read / 公開 view 非露出
束縛の bind/unbind は内部管理のみ (公開 API ではない)
アカウント削除 (POST /api/operator/account/delete) 時はユーザー削除に連動して解除
sot.lm_operator_account_deletions (本人アカウント削除の監査トレイル)
├─ staff_user_id (削除したユーザー。auth.users への FK なし=削除後も保持する snapshot)
├─ staff_email (削除時点のメール snapshot) / shops (束縛 shop snapshot) / source
└─ requested_at / deleted_at。staff_email は個人情報のため service_role 限定・agent_read / 公開 view 非露出
sot.lm_apps (LMile ホスト型ミニアプリ registry)
├─ app_key UNIQUE / shop 束縛 / status / machine_id(実行環境) / manifest(購読・必要env宣言)
│
├──< sot.lm_app_subscriptions (イベント購読 / UNIQUE (app_id, event_type))
│
├──< sot.lm_app_deliveries (アプリ向けイベント配信 outbox + 送信ログ)
│ └─ UNIQUE (app_id, idempotency_key) / event_payload は PII 除去済 snapshot
│ delivery_status: pending / sent / failed / skipped (+ dead_letter)
│
└──< sot.lm_app_executions (handler 実行ログ / append-only)
└─ status: ok / error / timeout + duration_ms / log_excerpt / actions_called
read view: lm_v_apps(token除外) / lm_v_app_subscriptions
/ lm_v_app_deliveries(event_payload の properties・shipTo 除去) / lm_v_app_executionsテーブル一覧
sot
products
商品マスター(1 row = 1 barcode)
sot
product_identifiers
商品識別子(shopify_variant_id 等)
sot
product_update_logs
商品変更ログ(created / updated)
sot
inventory_levels
在庫マスター(1 row = 1 商品 × 1 拠点・available_qty は取り置きを引いた後の値)
sot
lm_inventory_holds
在庫の取り置き台帳(UNIQUE (shop, reference_id, location_id, product_id)・quantity > 0・解除した行は削除・合計が inventory_levels.held_qty)
sot
inventory_update_logs
在庫変更ログ
sot
inventory_daily_snapshots
在庫日次スナップショット
sot
lm_stocktake_sessions
棚卸セッション(拠点ごとに進行中 1 つ・status: counting → submitted → committed / cancelled・mode: shelf / location)
sot
lm_stocktake_shelves
セッションの中で数える棚(counting / closed・started_at・movement_detected・recount_no)
sot
lm_shelves
棚マスタ(UNIQUE (shop, location_id, shelf_code)・zone・is_active)
sot
lm_shelf_condition_stock
棚 × barcode × 商品状態の数(良品以外だけ・販売可能数に入らない)
sot
lm_stocktake_counts
棚卸の計数(棚 × 商品 × 状態・counted_qty / expected_qty / superseded_at / applied_at / apply_error_kind)
sot
lm_stocktake_location_lines
拠点全体の棚卸(店舗)の商品ごとの行(提出で固定・expected_qty = 生の在庫数 + 引き当て済み未確保・movement_detected・write_back)
sot
lm_inventory_external_adjustments
外部システム(スマレジ / Shopify)へ当てる在庫の差分(相対値・status: pending → claimed → applied / failed / unknown)
sot
inventory_condition_codes
商品状態のマスタ(PK (shop, code)・is_default = 良品・allocatable_default は表示メタ。A/B/C/UNKNOWN。良品以外の数は lm_shelf_condition_stock)
sot
inventory_ledger
取り置きの履歴 append-only(event_type = hold / release・idempotency_key 指定時一意・真実源ではない)
sot
locations
拠点マスター
sot
location_identifiers
拠点識別子
sot
customers
顧客マスター
sot
customer_identifiers
顧客識別子
sot
order_line_master
受注(1 row = 1 販売単位)
sot
order_line_master_update_logs
受注変更ログ
sot
lm_fulfillment_source_members
出荷元 → 在庫ロケーション 紐付け(1:N)
sot
lm_fulfillment_source_webhook_config
出荷元の合算在庫変動 webhook 送信設定(出荷元単位・secret 暗号化)
sot
lm_fulfillment_source_inventory_state
出荷元×product ごとの前回送信した合算値(dedup)
sot
lm_fulfillment_source_inventory_events
合算在庫変動イベント outbox + 送信ログ(secret なし)
sot
lm_routing_orders
受注ルーティングの注文ヘッダ(routing-native)
sot
lm_routing_order_ship_to_changes
宛先住所・氏名の変更履歴(append-only・before/after・PII・service_role 専用)
sot
lm_routing_decisions
ルーティング判定結果(unit 単位)
sot
lm_routing_candidates
ルーティング候補スコア snapshot
sot
lm_shipping_instructions
出荷指示 dispatch ログ
sot
lm_routing_allocation_webhook_config
引き当て暫定確定 webhook 送信設定(shop 単位・secret 暗号化)
sot
lm_routing_allocation_events
引き当て結果イベント outbox + 送信ログ(lines snapshot・secret なし)
sot
lm_location_dispatch_config
WMS ディスパッチ設定(在庫ロケ単位・secret 暗号化)
sot
lm_location_dispatch_log
WMS 送信ログ(secret なし)
sot
lm_wms_shipping_requests
WMS 出荷指示 SHIPPING_REQUEST の送信記録(payload は PII を含むため view 非公開)
sot
lm_location_star_printers
在庫ロケーション → Star プリンター device ID 紐付け(1:1)
sot
lm_fulfillment_shipments
出荷元ヘッダ(注文 × from_location・追跡番号/ラベルPDF/status・外部フルフィルメント受理マーカー external_fulfillment_id)
sot
lm_external_sku_mappings
外部システム SKU ↔ barcode の明示マッピング(UNIQUE (shop, system, external_sku)・is_active・人間レビュー済みの登録のみ)
sot
lm_fulfillment_status_webhook_config
出荷ステータス変動 webhook 送信設定(shop × 取込元単位・source_system NULL = 既定宛先・secret 暗号化)
sot
lm_fulfillment_status_events
出荷ステータス遷移イベント outbox + 送信ログ(secret なし)
sot
lm_fulfillment_units
単位フルフィルメント明細(1 row = 1 販売単位)
sot
lm_shipment_memos
出荷(shipment)単位の手書きメモ(追記のみ = 監査ログ・body/投稿者は PII 相当で service_role only / agent_read 非露出)
sot
lm_share_analytics_shares
店舗→EC送客の共有(1 共有 = 1 行・トークン/スタッフメールは hash 列のみ・UNIQUE source+source_share_id・service_role only / agent_read 非露出)
sot
lm_share_analytics_items
送客共有の商品スナップショット(UNIQUE source+source_item_id)
sot
lm_share_analytics_events
送客の追跡イベント(開封/LINE push/LIFF 開封/商品クリック/カート追加/購入。PII は hash 化・order_id_reference は internal-only)
sot
lm_oversell_cases
売越しケース(8 ステップ + wont_do)
sot
lm_oversell_status_webhook_config
売越しケース受付完了 webhook 送信設定(shop 単位・secret 暗号化)
sot
lm_oversell_status_events
ケース受付完了イベント outbox + 送信ログ(lines snapshot・secret なし・UNIQUE (oversell_case_id))
sot
lm_order_update_webhook_config
受注情報更新 webhook 送信設定(shop 単位・secret 暗号化)
sot
lm_order_update_events
受注更新イベント outbox + 送信ログ(修正後 ship_to snapshot=PII を含み service_role only / 公開 view 非露出・UNIQUE なし)
sot
lm_picking_lists
ピッキングリスト生成ログ(append-only / PDF は Storage bucket picking-lists)
sot
lm_shelf_links
棚コード ↔ fulfillment shipment 紐付け(アクティブ一意性は partial unique index / 解除は released_at)
sot
lm_shelf_inventory
棚在庫(qty 集約・UNIQUE shop+location+shelf_code+barcode・商品参照は barcode のみ・MFC 入庫は棚別 mode=absolute(絶対値 set) / adjust(差分) + inventory_levels への barcode 集約 rollup)
sot
lm_shelf_inventory_logs
棚在庫の増減ログ(append-only / delta / qty_after / reason / operator)
sot
lm_operator_staff_shops
倉庫スタッフ ↔ shop の operator API 認可束縛(UNIQUE (staff_user_id, shop)・失効は is_active・PII を含み service_role only / agent_read 非露出)
sot
lm_operator_account_deletions
本人アカウント削除(/api/operator/account/delete)の監査トレイル(staff_user_id は FK なしの snapshot・staff_email PII を含み service_role only / agent_read 非露出)
sot
lm_fulfillment_source_changes
出荷元変更 + 返送レグ(旧/新 出荷元・在庫・返送追跡番号/ラベル・batch_id = 倉庫間移動バルク所属)
sot
lm_transfer_batches
拠点間移動バルク(kind: return = 返送 / inbound = 出荷元への入荷転送。open → dispatched → received・配送状況スナップショット・内容物リスト PDF パス・作成者 snapshot。read は agent_read.lm_transfer_batches / lm_transfer_batch_units safe view)
sot
lm_carrier_pickups
キャリア集荷依頼(オンコールピックアップ)1 回分のヘッダ(prn = 受付番号・集荷日・時間帯 HHmm・宛先国ごとの個口内訳 pieces・総重量・依頼者 snapshot。status: pending(キャリア問い合わせ前の予約)→ requested / failed・取消は cancelled。メンバーは lm_fulfillment_shipments.pickup_id)
sot
lm_stock_transfers
拠点間 在庫移動ヘッダ(商品×数量の location→location 移動。3 軸ステータス progress/approval/modification_request・UNIQUE (shop, idempotency_key) 冪等・実数量は自己在庫のみ棚±で反映。返送バルク lm_transfer_batches とは別物。read は agent_read.lm_stock_transfers)
sot
lm_stock_transfer_lines
在庫移動明細(barcode × 数量 request/quantity/shipped/received accepted/rejected・UNIQUE (stock_transfer_id, barcode)・CHECK shipped_quantity <= quantity(売越防止)/ received_accepted + received_rejected <= shipped_quantity。read は agent_read.lm_stock_transfer_lines)
sot
lm_stock_transfer_modification_requests
在庫移動の出庫内容 修正依頼(入庫検品中のみ・status: requested/completed/deleted・active は partial unique 1 件・明細スナップショット)
sot
lm_stock_transfer_shelf_logs
在庫移動が自己在庫棚を ± した attribution 追記ログ(reason: ship_out/receive_in。棚在庫ログ本体とは別)
sot
lm_apps
LMile ホスト型ミニアプリ registry(shop 束縛・manifest)
sot
lm_app_subscriptions
アプリのイベント購読
sot
lm_app_deliveries
アプリ向けイベント配信 outbox + 送信ログ(PII 除去済 snapshot)
sot
lm_app_executions
アプリ handler 実行ログ(ok / error / timeout)
read は agent_read.* の safe view 経由(products / inventory_levels / inventory_daily_snapshots / inventory_update_logs / product_update_logs / order_line_master / stocktake_sessions / stocktake_counts / inventory_condition_codes / inventory_ledger / shelf_stock / shelves / stocktake_shelves / stocktake_location_lines / inventory_external_adjustments)。
Last updated
Was this helpful?