🧪 設計イメージ:アカウントの考え方と、登録パターンごとのデータの増え方。画面はすべてダミーです。 ← 入口へ戻る

アカウントの考え方

出てくるのは3つだけ

生産者組合は、卸から見れば生産者、農家から見れば流通事業者。この二役を別々のシステム・別々のアカウントで受けると破綻します。 アカウントは会社につき1つ。役目は「相手の帳簿のどちら側にいるか」で決まる ―― その具体像を、登録パターンごとに追います。 (根拠:ADR-0002)

出てくるものは3つだけ

英語の名前は最後に覚えれば十分です。まず身近な言い方で押さえてください。

🏢
会社アカウント
company

1つの会社につき1つ。「生産者」「流通事業者」といった肩書きは持ちません。無料か有料かはプランの違いだけで、別々のアカウントにはなりません。

無料 相手とのやり取りだけ
生産者として使うなら 発注を受ける・出荷可能数を答える
買い手として使うなら 注文を出す・注文履歴を見る
有料 + 在庫・出荷割当・原価
👤
ログインする人
user

担当者。1つの会社に何人いてもかまいません(追加は無料)。パスワードは作りません ―― 届いたリンクを押して、6桁のコードを1回入れるだけ。

忘れるパスワードが存在しないので、「ログインできない」の電話が起きません。
📇
取引先マスタ
supplier(仕入先)/ customer(得意先)

自分のアカウントの中に持つ取引相手の一覧。1行=1社。相手がシステムを使っていなくても書けます(というより、普通は使っていません)。

相手もアカウントを持っていれば、その行と相手の会社がひもづくだけ。
📇 取引先マスタの「行」と 🏢「会社アカウント」は別物(ここがいちばん混乱します)

スマホの連絡先アプリと同じです。連絡先の「山田太郎」はあなたが書いたメモ。相手が同じアプリを使っていれば本人のアカウントがひもづいてチャットできる。使っていなければ、ただの名前と電話番号のまま ―― でも電話はかけられる。

📇 坂ノ途中の仕入先マスタ 1行
やまと出荷組合
契約単価 12品目 / FAX 06-xxxx / 呼び名「やまと」
この行の持ち主 = 坂ノ途中
相手を指す欄 = まだ空
坂ノ途中が自分用に書いたメモ。編集するのも坂ノ途中。
参加すると
→
ひもづく
🏢 やまと出荷組合 の会社アカウント
やまと出荷組合
プラン / 自社の仕入先・在庫 / ログインする人
このアカウントの持ち主 = 組合
組合が自分で管理するもの。坂ノ途中は触れません。
なぜ分けるのか=持ち主が違うから

同じ「やまと出荷組合」でも、坂ノ途中の帳簿と青果卸Bの帳簿では別の行(契約単価も呼び名も違う)。でも相手は同じ1社。

坂ノ途中の行 #101 ─┐
         ├─→ 🏢 組合(1社)
卸Bの行 #77 ────┘
ひもづくと何が変わるか
空(ふつう)ひもづき済
発注メール・FAX相手の画面に届く
相手の視界なし自分宛の行だけ
出荷→入荷手入力自動で引き継ぎ

空が異常ではありません。空のまま一生使われる行が多数派です。

いちばん大事な1点:役目は会社ではなく「表のどちら側にいるか」で決まる
🏢 坂ノ途中 のアカウント
📇 仕入先マスタ
・やまと出荷組合
・類農園
・北山ファーム
→ ここにいる=生産者
🏢 やまと出荷組合 のアカウント
📇 仕入先マスタ
・田中農園
・佐藤ファーム
📇 得意先マスタ
・坂ノ途中
やまと出荷組合は、
坂ノ途中の帳簿では 仕入先(=生産者)、
自分の帳簿では 持ち主、
そして 坂ノ途中 を 得意先 として持つ。
アカウントは1つのまま。肩書きを持たないから、三役が同居できます。

登録パターン別:何が増えて、何が増えないか

実務で起きる8つの場面です。緑=増える グレー=変わらない

A
取引先マスタに登録しただけ
相手はシステムを使っていない(メール・FAX・電話で取引)
📇 取引先マスタ +1 🏢 会社アカウント 変わらず 👤 ログイン 変わらず

いちばん多いのがこれ。相手がシステムを使っていなくても、発注も入荷も出荷割当も全部回ります。この状態が「普通」で、以下は全部おまけです。

B
招待したら、相手が新しく参加した
リンクを押して、6桁コードを1回入れるだけ
🏢 会社アカウント +1(無料) 👤 ログイン +1 📇 その行に相手がひもづく 💰 請求 変わらず

相手は無料。パスワードは作りません。会社名や連絡先は招待した側の取引先マスタから引き継ぐので、相手が入力するのは担当者名くらいです。

C
招待したら、相手はもう使っていた
相手は別の会社と既に取引していた(=逆順のケース)
📇 その行に相手がひもづく 🏢 会社アカウント 増えない 👤 ログイン 増えない

増えるのは「ひもづき」だけ。相手は今のログインのまま承諾を押すだけです。だから、どちらが先に始めても同じ形に着地します。

D
相手が「在庫まで自分で管理する」と決めた
出荷組合が、自分の農家の分を管理し始める
🏢 プランが 無料 → 有料 💰 請求 +1 🏢 会社アカウント 増えない 👤 ログイン 増えない 📇 取引先マスタ 変わらず

ここが有料化の瞬間。それでもデータは1行も増えません。今の画面のまま、メニューに「在庫」「出荷割当」が生えるだけ。新しいアカウントもログインし直しもありません。

E
相手の会社で、担当者が増えた
組合の事務員がもう1人使いたい
👤 ログイン +1 🏢 会社アカウント 変わらず 💰 請求 変わらず

ひもづきは会社どうしなので、人が増えても取引先に連絡する必要はありません。人数では課金しません(増やすのをためらわせないため)。

F
別の会社からも招待された
組合が卸Xに加えて卸Yにも出荷を始めた(n:n)
📇 卸Yの取引先マスタに +1 📇 その行にひもづく 🏢 会社アカウント 増えない 👤 ログイン 増えない

何社とつながってもアカウントは1つ。しかも相手の画面を見に行く必要はありません ―― 卸Yの発注は、組合の画面に受注として届きます。

H
招待を断られた/相手がデジタル無理
高齢の農家、スマホを持たない、電話とFAXだけ
🏢 会社アカウント 増えない 👤 ログイン 増えない 📇 「代行入力」を有効に

これは想定内の運用で、妥協ではありません。電話で聞いた出荷可能数をハブ側の担当者が代わりに入力します(誰が代行したかは記録)。システムは問題なく回ります。

G
取引をやめた
来季から取引しないことになった
📇 ひもづきを停止 📇 行は残す 🏢 会社アカウント 残す

消さないのが大事。取引先の行を消すと、過去の発注書・入荷・ロットの追跡(誰の畑の何だったか)が壊れます。停止すれば相手からは見えなくなり、再開はひもづけ直すだけ。

早見表
場面 🏢 会社アカウント 👤 ログイン 📇 取引先マスタ 💰 請求
A 取引先を登録しただけ——+1—
B 招待 → 相手が新規参加+1(無料)+1ひもづく—
C 招待 → 相手は利用中——ひもづく—
D 相手が在庫管理を始めたプラン変更のみ——+1
E 担当者が増えた—+1——
F 別の会社とも接続——+1—
H 招待を断られた(代行入力)——設定のみ—
G 取引をやめた残す残す停止(残す)—

表を縦に見ると分かること ―― 💰 請求が増えるのは D だけ、🏢 アカウントが増えるのは B だけ(相手がシステム初体験のときのみ)。あとは何をしても、増えるのは取引先マスタの行とひもづきだけです。

① 卸がアカウントを作り、取引先マスタに生産者を登録する

この時点で組合はアカウントを持ちません。ただの取引先の1行で、発注はメール/FAXで届きます。相手にアカウントを要求しないことが出発点。

tsunagu.app/c/midori/masters/suppliers
つなぐ
🏢 坂ノ途中 有料プラン
ダッシュボード 発注 入荷 出荷割当 マスタ
田田中
📇 仕入先(生産者)マスタ 3件
生産者名区分認証発注の届け方アカウント
やまと出荷組合出荷組合 有機JAS ✉️ メール ⚪ なし
類農園農業法人 有機JAS 📠 FAX ⚪ なし
北山ファーム個人 特別栽培 ☎️ 電話(代行入力) 🤝 代行入力 招待しない

「アカウント」列はマスタの1属性にすぎません。なしでも、発注・入荷・出荷割当はすべて成立します。北山ファームのように最初から招待しないという選択も普通です。

🗄 このとき裏で起きていること
用語は へ
companies(会社アカウント)
NEW#1 坂ノ途中 plan=hub 💰
users
NEWtanaka@midori → company#1
suppliers (company#1 の仕入先マスタ)
NEW#101 やまと出荷組合 linked=NULL
NEW#102 類農園 linked=NULL
NEW#103 北山ファーム linked=NULL
代行入力=有効
会社 1
ログイン 1
課金 1

② 招待する → 相手はパスワードなしで参加する

相手がやることはリンクを押して、届いた6桁を1回入れるだけ。パスワードは作りません。会社名・連絡先は招待元の取引先マスタから引き継ぎます。

🗂 ②で動く表と関係 ── 枠=会社アカウント(テナント)。枠をまたぐ線は linked_company_id 1本だけ
🏢 company #1 坂ノ途中 plan=hub 課金しているのはこの1行だけ
suppliers仕入先マスタ
PK#101 やまと出荷組合
FKcompany_id = #1
UPDlinked_company_id
NULL → #2
UPDinvite_status
招待中 → 接続済
customers得意先マスタ
PK#C1 みどり生協
FKcompany_id = #1
linked_company_id = NULL
この②では動かない
(動かすのは )
usersログインする人
FKcompany_id = #1
👤 tanaka@midori
何人でも/追加は無料
password_digest は無い
↓
招待(メール/SMS の署名付きリンク + 6桁コード)を相手が承諾した瞬間だけ、下の枠が生まれる
すでに使っている相手なら生まれず、上の linked_company_id が張られるだけ(=パターンC)
🏢 company #2 やまと出荷組合 plan=free NEW課金は増えない
customers得意先マスタ 🪞ミラー行
NEW#251 坂ノ途中
FKcompany_id = #2
FKlinked_company_id = #1
これが無いと卸の発注が
この会社の画面に着地しない
usersログインする人
NEWcompany_id = #2
👤 info@yamato
パスワードは作らない
(認証用の表も増えない)
suppliers仕入先マスタ
まだ0行。
自分も農家を登録し始めたら
ここに増える()

増えた表はありません。増えたのは companies 1行・users 1行・customers 1行(ミラー行)と、上の枠の linked_company_id の更新だけ。
同じ関係が2行で表されているのがポイントです ── suppliers#101(坂ノ途中の帳簿では「仕入先」)と customers#251(組合の帳簿では「得意先」)は同じ1つの取引の裏表。共有の1行にはしません(取引先マスタは会社ローカル=不変条件3。相手が勝手に自分の帳簿を書き換えられないため)。

2-a 卸側:招待を送る(メール または SMS)
tsunagu.app/c/midori/masters/suppliers/101
やまと出荷組合
区分出荷組合
契約単価12品目 設定済
やまと出荷組合を招待する

相手は無料で使えます。パスワードの設定はありません。

送り方
✉️ メール
📱 SMS
メールを見ない生産者には SMS を選べます
相手に見せる範囲
✅ 自社宛の発注・出荷案内・入荷実績・契約単価
🚫 他生産者の情報・出荷割当・原価・得意先
2-b 組合側:リンクを押す → 6桁コード → 完了(パスワードなし)
tsunagu.app/invite/8f3a…
STEP 1/2
坂ノ途中 から
招待が届いています
お客さまの会社
やまと出荷組合
ご連絡先
info@yamato-group.jp

内容は招待元が登録済みです。入力の必要はありません。

tsunagu.app/invite/8f3a…
STEP 2/2
届いた6桁の番号を
入れてください
4 1 7 2

info@yamato-group.jp に送りました

届かない場合は再送

パスワードの設定はありません

tsunagu.app/c/yamato/home
✅ 完了
やまと出荷組合 さんの画面
今週やること
📩 坂ノ途中から受注 8件
📝 出荷可能数の入力 3件

次回からはブックマークから直接入れます(端末を変えたときだけコードを再送)。

相手は自分の画面だけを見ます。「坂ノ途中のシステムに入る」のではなく、坂ノ途中の発注が自分の画面に届く形。接続先が増えても見る画面は1つのままです。

2-c 販売先(買い手)を招待するときも同じ。向きだけが逆になる

招待リンクは1種類だけです。「生産者PFへの招待」「買い手PFへの招待」という区別はありません ── company に種別カラムを持たないので、相手が見る画面は 相手側にできるミラー行の向きで決まります。送る側がやることは、どちらのマスタの行から送るかだけ。

🌱 仕入先マスタの行から送る
やまと出荷組合を招待(=2-a・2-b)
suppliers #101 やまと出荷組合
→ linked_company_id=#2
↓ 承諾
🪞 相手側にできるミラー行
customers #251 坂ノ途中
相手から見れば、こちらは得意先
↓
相手に見えるのは 生産者PF
受注 / 出荷可能数
🛒 販売先マスタの行から送る
みどり生協を招待
customers #C1 みどり生協
→ linked_company_id=#3
↓ 承諾
🪞 相手側にできるミラー行
suppliers #◯ 坂ノ途中
相手から見れば、こちらは仕入先
↓
相手に見えるのは 買い手PF
注文 / 注文履歴

増える行の数はどちらも同じ(会社+1・ログイン+1・ミラー行+1)。会社アカウントは無料(plan=free)で、 無料でできることが「発注を受ける」か「注文を出す」かは、このミラー行の向きが決めています。
未招待のままでもかまいません。買い手PFが要るのは買い手自身に注文を入れてもらうときだけで、CSV/API取込・電話+注文打込なら接続なしで取引が回ります(量販・加工はEDIが普通)。 両方の表に行がある相手(売りも買いもある相手)なら、相手には2つのPFが見えてヘッダーで切り替わります。

🗄 このとき裏で起きていること
用語は へ
companies
同#1 坂ノ途中 plan=hub 💰
NEW#2 やまと出荷組合 plan=free(無償)
users
同tanaka@midori → company#1
NEWinfo@yamato → company#2
password なし
suppliers(company#1)
UPD#101 やまと出荷組合
linked_company_id=#2
invite_status=接続済
同#102 類農園 linked=NULL
同#103 北山ファーム linked=NULL
customers(company#2 側)🪞 ミラー行
NEW#251 坂ノ途中
company_id=#2 / linked=#1
※ これが無いと卸の発注が
組合の画面に着地しない
会社 2
ログイン 2
課金 1 ←増えず

認証用のテーブルは増えません(署名付きリンク+短命コード)。パスワードの保管場所そのものを作らないのが方針。

③ 組合が「自分でも在庫と出荷割当を回したい」→ プランを上げるだけ

データは1行も増えません。新しいアカウントも、ログインし直しもなし。いまの画面のまま、メニューが増えるだけです。

3-a 自分の画面の中から、そのまま切り替える
tsunagu.app/c/yamato/home
🌾
自社の農家からの集荷も、ここで管理できます
在庫・出荷割当が使えるようになります
くわしく見る
在庫・出荷割当を使う

やまと出荷組合として、自分の仕入先(農家)・在庫・出荷割当を管理します。

✅ 変わらないこと
  • いまのログインのまま。新しいアカウントは作られません
  • 坂ノ途中との取引はそのまま継続
  • 坂ノ途中側から見た御社の情報は何も変わりません
➕ 流通事業者アプリが使えるようになります
  • 仕入先(農家)の登録・招待・代行入力
  • 入荷・在庫(ロット・産地・認証)
  • 販売設定・出荷割当(誰の品をどこへ)
いま使っている生産者アプリはそのまま残ります(坂ノ途中に出荷可能数を答える仕事は続くため)。2つを切り替えて使います。
プラン スモール(〜30生産者) 30日間無料
3-b 昇格しても生産者アプリは残る。流通事業者アプリが1つ増えるだけ
前(無料プラン)― 使えるアプリは1つ
🌱
生産者アプリ
スマホ・圃場で使う
🏠 ホーム
📊 出荷可能
坂ノ途中に出荷可能数を答える
プラン変更
→
後(有料プラン)― 2つを切り替えて使う
🌱
生産者アプリ
🏠 ホーム
📊 出荷可能
そのまま残る(卸に答える仕事は続く)
🏢
流通事業者アプリ NEW
📇 仕入先(農家)
📦 入荷・在庫
💰 販売設定
🎯 出荷割当
PCで使う(情報量が多い)
tsunagu.app/app/dashboard ← 流通事業者アプリ
つなぐ
🏢 流通事業者 ▾
やまと出荷組合 で使えるアプリ
🏢 流通事業者アプリ ✓
🌱 生産者アプリ 坂ノ途中向け
やinfo@yamato

同じログインのまま、2つのアプリを行き来します。メニューを1つに混ぜないのは、圃場のスマホ操作と事務所のPC操作が別物だからです(ADR-0006)。データ・アカウントは1つのまま。

⬆️ 昇格は供給側にしかない

生産者 → 流通事業者は起きる(組合が自分でも束ね始める)。一方 買い手 → 流通事業者はほぼ起きない。だから「自社でも束ねますか」の案内は生産者アプリにだけ置き、買い手アプリには置きません。

💰 データは1行も増えない

増えるのは company.plan の値だけ(free → hub)。アカウントもログインも取引先マスタも変わりません。「テナントを作る」という操作が存在しないので、移行に失敗しようがありません。

🗄 このとき裏で起きていること
用語は へ
companies
同#1 坂ノ途中 plan=hub 💰
UPD#2 やまと出荷組合
plan: free → hub 💰
users
同info@yamato → company#2
suppliers
同#101 やまと出荷組合 linked=#2
※ 卸側は一切変わらない
会社 2
ログイン 2
課金 2

差分は 1列の値だけ(plan)。行は1つも増えません。「無償で使い始めた相手が課金に転じる」=この構造がそのまま拡販導線。

④ 組合が農家を登録する(=①に戻る)+ 代行入力

画面は①とまったく同じ。会社名が違うだけです。ここから②③がそのまま繰り返されます。

4-a 組合の仕入先マスタ ── ①と同一画面
tsunagu.app/c/yamato/masters/suppliers
つなぐ
🏢 やまと出荷組合 有料プラン
ホーム 出荷可能 マスタ 入荷・在庫 出荷割当
やinfo@yamato
📇 仕入先(生産者)マスタ3件
生産者名区分認証やり取りアカウント
田中農園個人 有機JAS 📱 システム ● 接続済
佐藤ファーム個人 有機JAS ✉️ メール ◐ 招待中
山本農場個人 慣行 ☎️ 電話 🤝 代行入力

3つの状態が混在してよい(接続済/招待中/代行入力)。組合の農家は電話・紙が普通なので、アカウントを持たない行が多数派という前提で作ります。

4-b 代行入力:電話で聞いた数を、事務員が代わりに入れる
tsunagu.app/c/yamato/shippable?on_behalf_of=203
🤝
山本農場さんの代わりに入力しています
この入力は「事務局・佐々木が代行」として記録されます
商品月水金
大根 青首2L40—30
白菜 2L—25—

代行入力は妥協ではなく、想定内の主要な運用形態です。相手にアカウントを作ってもらえなくても、システムは完全に回ります。誰が代行したかを記録することで、責任の所在だけは残します。

🗄 このとき裏で起きていること
用語は へ
companies
同#1 坂ノ途中 hub 💰
同#2 やまと出荷組合 hub 💰
NEW#3 田中農園 plan=free
※ 佐藤・山本はアカウントなし
suppliers(company#2)
NEW#201 田中農園 linked=#3
NEW#202 佐藤ファーム linked=NULL
invite_status=招待中
NEW#203 山本農場 linked=NULL
代行入力=有効
customers(company#2 の得意先)
同#251 坂ノ途中 linked=#1
=組合から見た卸は得意先。
②の承諾時に自動生成済み(無料
プランでも受注に必要なため)
会社 3
ログイン 3
課金 2

company#1 は自分のアカウントの持ち主でありながら、company#2 からは得意先の1行として見られている。同じ会社が、相手の帳簿では別の役。

逆順 ── 組合が先に使い始めて、あとから卸が登録する場合

結論:同じ形に着地します(順序非依存)。招待が「アカウント発行」ではなくすでにある2社をひもづける操作だからです。

順方向(①〜④で見た流れ)
1
卸がアカウント作成 → 組合を linked=NULL で登録
2
招待 → 組合が新規参加(コード入力)
3
組合がプランを上げる
4
組合が農家を登録
逆方向
1
組合が自分でアカウント作成 → 有料プランで使い始める
2
組合が農家を登録・招待(=④が先に来る)
3
あとから卸がアカウント作成 → 組合を linked=NULL で登録
組合が既に使っていることを卸は知らなくてよい
4
招待 → 組合は「承諾」を押すだけ
アカウントもログインも増えず、ひもづきだけができる
🎯 どちらの順序でも、最終的なデータは完全に同一
companies
#1 坂ノ途中 hub
#2 やまと出荷組合 hub
#3 田中農園 free
users
tanaka@midori → #1
info@yamato → #2
ひもづき
#1 の supplier#101 → #2
#2 の customer#251 → #1
逆順で必要になる唯一の違い ── 参加ではなく「承諾」になる
tsunagu.app/invitations/8f3a2b…ログイン中
つなぐ
ややまと出荷組合 でログイン中
招待が届いています
坂ノ途中 から、
生産者としての取引を申し込まれています
承諾すると
✅ 坂ノ途中からの発注がこの画面に届くようになる
✅ 自社の出荷が、そのまま出荷案内として渡る
🚫 自社の農家・在庫・原価は相手に見えない

新しいアカウントもパスワードも作られません

🔍 「相手はもう使っている」と、いつ分かるのか

取引先マスタの行は、相手が使っているかどうかを知りません(知る必要がない)。分岐が起きるのは本人確認が済んだあとです。

① 招待を送る
宛先(メール/SMS)と「招待中」を記録するだけ。
卸は相手の利用状況を知らないまま送る
→
② 6桁コードを通過
ここで初めて「この人はこの宛先の持ち主だ」が確定する
→
③ その宛先の人を探す
いた → その人の会社にひもづける(=利用中)
いない → 会社とログインを新規作成(=新規参加)
1人は1社にしか属さないので、本人が確定すれば会社は一意に決まる
🔒 送信時に「利用中です」とは表示しない

表示すると、任意のメールアドレスを入れて他社の在籍を調べられてしまうため。送り主が知るのは、承諾されて「接続済」になった結果だけ。

🎫 もう1つの経路:会社コードで申請

相手が使っていると分かっているなら、相手の会社コードを入力して接続を申請(承認は相手側)。宛先メールに依存しないので会社の重複が起きません。

🔗 ひもづきは両側から張れる

組合は自分の得意先マスタに「坂ノ途中」を先に登録済みのことが多い。その行に後からひもづきが入るだけで、取引履歴は途切れません。

卸が先
supplier#101 → #2
組合が先
supplier#101 → #2 (同じ)
組合から申請
customer#251 → #1
⚠️ 逆順で気をつけること:会社の重複

卸が招待するとき、組合の別の担当者アドレスに送ると、その人は既存アカウントの存在を知らずに新規参加し、「やまと出荷組合」が2つできてしまいます。

対策の候補(未決)
  • メールドメイン一致で「既存の会社に参加しますか」とサジェスト
  • 招待コード方式(組合が自分のコードを卸に渡す)
  • 最終手段としての会社の統合

これはデータ構造の欠陥ではなく、招待導線の設計課題。→ ADR-0002 の未決事項に記録済み

★ 全体像 ── 階層が増えても、増えるのは「行」だけ

会社アカウント × 取引先マスタのひもづき
農家
田中農園 / 佐藤ファーム / 山本農場
アカウント:ありなし混在
プラン:無料(or なし)
電話・紙のままの農家が多数派
出荷 → 入荷
→
company #2
やまと出荷組合
プラン:有料 💰
仕入先マスタ:農家3件
得意先マスタ:坂ノ途中
農家からは流通事業者
卸からは生産者
自分では持ち主
出荷 → 入荷
→
company #1
坂ノ途中
プラン:有料 💰
company#2 からは 得意先の1行として見られている(本人は意識しない)
→
買い手
スーパー・飲食店
アカウント:ありなし混在
プラン:無料(or なし)
得意先マスタの行。参加すれば買い手PF()

左端の農家と右端のスーパーはまったく同じ仕組み(誰かの取引先マスタの1行で、アカウントは任意)。「生産者PF」と「購入者PF」はどちらの表にいるかが違うだけで、別プロダクトではありません。

🔁 「流通事業者として登録する」という操作は存在しない

会社アカウントに種別カラムがないので、切り替えるべき状態がありません。起きているのは次の2つだけで、別々のアカウントの、別々の表の話です。だから衝突しようがなく、順序も関係ありません。

🏢 やまと出荷組合 じしんのアカウント
plan = 有料 ← これが「流通事業者として使っている」の正体
📇 仕入先マスタ:田中農園・佐藤ファーム・山本農場
📇 得意先マスタ:坂ノ途中・青果卸B
🏢 坂ノ途中 のアカウント
📇 仕入先マスタ
・やまと出荷組合 linked=#2
← ここに行があることが「坂ノ途中の生産者である」の正体
🏢 青果卸B のアカウント(あとから)
📇 仕入先マスタ
・やまと出荷組合 linked=#2
← 増えたのはこの1行だけ。組合側は何も変わらない
どの順序でも同じ
  • ハブを使い始めてから、別の卸に招待される
  • 卸に招待されてから、自分もハブを使い始める
  • 同じ2社の間で売りも買いもある(横持ち・転売)→ 仕入先マスタと得意先マスタの両方に行があるだけ。計4行が並存して矛盾しない
🪞 承諾すると、対になる行が自動でできる

卸Bの招待を承諾すると、組合の得意先マスタに「青果卸B」の行が自動生成されます(これがないと卸Bの発注が組合の画面に着地しない)。組合がすでに卸Bを得意先として登録済みなら、新規作成せず既存行との突合を確認します。

🕸 n:n(多数の組合 × 多数の卸)でも構造は変わらない

アカウントも人も増えず、各社の取引先マスタに行が1つずつ増えるだけ。

✅ 構造的に問題ないこと
  • 接続の数に上限なし。1社が何社とつながってもアカウントは1つ
  • 同じ2社の間で売りも買いもある(相互取引)場合は、仕入先マスタと得意先マスタの両方に行があるだけ
  • 卸が組合を「東日本支部/西日本支部」と複数行に分けて管理していても可
⚠️ n:n で痛むのは構造ではなくここ
  • 供給の二重約束:無料プランのまま複数社とつながると、出荷可能数を各社に別々に答えることになり、同じ在庫を二重に約束しうる
  • 先方品番の対応表が n×m に増える
  • トレースが分岐する(循環にも備えが要る)

いずれも有料プランで在庫を一元化すれば解ける。= n:n はそのままプラン変更の動機になる。

🤝 階層をまたぐデータの接続

アカウントではなくロットがつながる。

// company#2(組合)側
shipment_line #900 → customer#251
↓ 双方アカウントありなら自動
// company#1(卸)側
inbound_line #700 source_lot_id=#L2-88
source_company_id=2
→ lot #L1-450 生成(再入力ゼロ)
  • 産地・認証・原価が下流へ自動で伝わる
  • 相手がアカウントなしなら文字列で捕捉。機能は劣化しても壊れない
⚠️ この構造で気をつけること
🚫
見える範囲を連鎖させない
田中農園の情報が、組合を飛び越えて卸に見えてはいけない。ひもづいている行だけが相手に見える。
🔀
マスタは統合しない
組合のSKUと卸のSKUは別物。先方品番の対応表で翻訳する。※その表はまだ無い(後から作る=D39)ので、階層をやるなら先にこれが要る。
🧱
アカウントなしが多数派という前提
接続を前提にした画面・処理を作らない。代行入力を先に用意する。
🔑
パスワードを作らない
認証手段を足すときも、この原則を先に確認する。
🔧 MVPで入れておく継ぎ目(実装は1社のままでよい)

Railsのモデルがまだ0本の今ならコストゼロ。後から足すと高くつく4点。

01
全業務テーブルに company_id
MVPは常に1固定でよい。常にスコープする癖をつける。
02
supplier / customer に linked_company_id
列1本。NULL が通常。将来の招待・握手・名寄せの唯一の鍵。
03
password_digest を作らない
招待リンク+ワンタイムコード。後から消すのは難しい。
04
課金は company.plan
ユーザー数課金にしない(担当者を増やすのをためらわせない)。
← 入口へ戻る 🌱 生産者の画面を見る 🗂️ データモデルを見る(ER図 §7)