マスタ管理(現行仕様)¶
読む順: この 1 本で全体像がつかめます。操作手順は
operations-manual/02-masters.md、
機械が守る不変条件は AGENTS.md の該当節です。同じことは二度書きません。
最終更新: 2026-09-05(mig119/131/183〜186/191 と現行マスタ画面を反映。mig247/249 の列権限境界・mig250 の買取精算は 2026-09-05 追記)
マスタ間の関連¶
この図は、日次業務がどのマスタを参照し、専用車の解決がどの関係に依存するかを示します。
取引先・品目のつながり。
工場・車両のつながり。
担当・配車のつながり。
1. 全体像 — 何のマスタがどこにあるか¶
| マスタ | 場所 | CSV | 主に使う機能 |
|---|---|---|---|
| 取引先 + 回収先 | /collector/partners |
取込あり(両方) | 配車・計量・請求設定 |
| 委託先 | /collector/external-partners |
出力 + 取込 | 委託回収の精算 |
| 車両 + 工場 | 車両: /collector/fleet/vehicles / 工場: 会社情報(/collector/profile)内の工場管理(旧 /collector/fleet/factories は redirect) |
取込あり | 配車・コスト・運行ログ |
| 品目(単位設定) | /collector/item-unit-settings |
— | 目方入力の袋数換算 |
| 二次搬出運搬費 | /collector/secondary-transport-routes |
— | P&L の収入引当 |
| メンバー | /collector/members |
— | ログイン・権限 |
| ドライバーマスター | /collector/drivers |
— | 免許・承認・事故歴 |
2. 取引先と回収先¶
取引先(会社)の下に回収先(現場)がぶら下がる 2 階層です。配車・計量・按分の キーはすべて回収先で、取引先は請求と表示のまとまりです。
取引先一覧の検索は名称・コードの部分一致です(大文字小文字を区別しません)。ページを跨ぐ全件を対象に絞り込み、検索語を変えると先頭ページへ戻ります。
取引先詳細には業務ごとのセクションが並びます。
- 回収先 — 現場の追加・編集・有効 / 無効。有効な同名は同一取引先内で 2 件作れません (DB の一意索引が機械強制する。空白の種類や大文字小文字の差だけの「実質同名」も同一視)
- 単価契約 — 品目 × 期間の単価。同じ品目の期間重複は DB が禁止します (画面の検証と DB の排他制約が一致している)
- 回収品目(段別課金) — 品目ごとに収集運搬と処分で別々の課金形態 (単価 × 数量 / 1 回定額 / 月額固定 / なし)
- 請求設定 — 締め日・支払サイクル・請求先メール
- 契約書ファイル — PDF / 画像を非公開バケットへ(50 MiB まで・短命署名 URL で閲覧)
- 最終処分場 — この取引先の回収先を「処分費を払って捨てる側」として扱うトグル。 二次搬出の行き先ピッカーはこれで絞られ、帰社計量の按分からは除外されます
- 重量データ — 取引先計 + 回収先別 × 品目の月次計量重量(金額は出さない。 請求は請求書管理機能で設計する予定で、ここに概算を置くと権威が二重になるため)
回収先 CSV 取込は「名前が一致したら更新・無ければ新規」の照合ルーティングです。 無効化した回収先の名前は再利用できます(一意なのは有効な同名だけ)。
取引先の削除は admin 限定で、回収先・契約・計量・二次搬出運搬費・ファイル・品目設定などの 紐づきが 0 件のときだけ実行できます。削除は物理削除ではなく復元可能な soft-delete です。取引終了など 今後使わない場合は、削除ではなく「無効化」を使います。
3. 委託先 — 取引先ではない¶
委託先は自社の回収を代行してもらう外部の労務・車両の提供元で、取引先(お客様)とは まったく別の概念です。名前が似ているので取り違えに注意してください。
- ドライバー — 委託先のドライバーを登録し、ログインを発行できる(発行した パスワードは画面を離れると再表示できないので、その場で本人へ伝える)。 委託先ドライバーは PWA で自分の配車と実績を見る
- 支払単価 — 品目ごとの支払レート(精算の単価)
- 車両リース — 委託先から借りている車両のリース料
- 月次の委託精算は別画面(
/collector/external-partner-settlements)。精算を確定すると 明細はスナップショットとして凍結され、元データを後から直しても確定済みの精算は変わらない
4. 車両と工場¶
- 車両は工場(拠点)に属し、ドライバーの見える範囲は所属工場で絞られます
(factory スコープ。工場の管理は会社情報(
/collector/profile)内の工場管理。旧/collector/fleet/factoriesは redirect) - 一覧は車検満了の期限切れ / 60 日以内を明示します
- 台帳として保険(会社・証券番号・保険料)・リース・車庫・車台番号など約 20 列を
持ちます。これらは他社に見せない機密です — 排出事業者側からの車両検索には、
開示してよい 4 列だけを返す専用 RPC を使います(表を直接開かない)。
社内でも
authenticatedロール直読みは A 列 11 個(id / tenant_id / 車番 / 社内コード / 車両名 / 工場 / 有効 / 構内機器 / 二次搬出専属 / 車種 / 最大積載量)だけで、 台帳列の読み書きは staff 専用の RPC(台帳一覧・更新・作成)経由です。vehiclesへ列を足すと既定で読めない側に落ちるため、開示したい列だけ明示的に足します。 車両一覧の取得は A 列の直 select と台帳 RPC に振り分け、select('*')で読まないでください。 - A列を使う画面の車両識別子は車番 → 社内コード → 車両名です。台帳を読むstaff画面では車番の次に車台番号を使います。どちらも共通関数に集約し、他社向けは専用RPCのラベルだけを使います。 driver 向けを含む A 列表示と越境表示では車台番号を識別子の代替に使いません(台帳機密)。
- フラグが 2 つ: 構内機器(フォークリフト等・配車やマッチングの対象外)と 二次搬出専属(P&L の「二次搬出のみ」表示で費用を絞るキー)
- 許可エリア(自治体の収集運搬許可)は車両に紐付き、staff(admin / normal)が編集できます
- 専用車担当者は複数人をチェックボックスで設定できます。割当の権威は車両とメンバーを結ぶ
vehicle_assigned_driversです。配車・日報での自動適用は active・非構内機器・工場一致の候補が ちょうど 1 台のときだけで、2 台以上の担当車は専用車表示を出さず手動選択になります。 - 車両 CSV の
担当ドライバーはセミコロン区切り(例:山田 太郎;鈴木 花子)です。 - 工場の削除は参照チェックが通るときだけできます。車両・運行ログ・工場所属の
紐づきが 1 件でもあれば「使用中のため削除できません。無効化をご利用ください。」で
拒否されます。車両の件数確認は A 列の
idだけを数え、select('*')は 列権限で壊れるため使いません。
5. 品目¶
- 品目そのもの(
item_types)は全テナント共通のグローバルマスタです(資源 7 品目が 有効)。テナントが品目を追加・改名する画面はありません - テナントごとに設定できるのは次の 2 種類です:
- 品目単位設定 — 目方入力で「袋」等の数を kg に換算する係数(品目 × テナント)。 staff が編集し、ドライバーは読むだけ。入力は単位、kg / 単位、事務の按分提案に使う丸め単位 kg の3項目です
- 回収先ごとの品目 — その現場で出る品目の絞り込み。ドライバーの目方入力の選択肢を 絞り、確定保存でもサーバー側で強制される(未設定の現場は全品目可)
回収先と車両には業務コード欄があります。空欄のコードはテナント内で自動採番し、CSV 取込では既存コードを照合して更新します。取引先・回収先の CSV は admin / normal が取り込めますが、車両 CSV は admin のみです。グローバルな item_types の CSV 取込ルートはありません。車両一覧にもコード列を表示し、車番が無い場合の表示識別子は共通の vehicleIdentity / vehicleIdentityLabel を使います。
6. メンバーとドライバーマスター¶
メンバー(/collector/members)はログインと権限の管理です。
- ロールは admin / normal / driver の 3 つ + 運転可フラグ(normal・admin でも 運転する人は目方入力などドライバー系画面に入れる)
- 権限の権威は認証トークン側(
app_metadata)で、画面の表示はそのコピーです。 最後の admin を降格・削除できないガードは権威側で判定します - 本人が変えられるのは自分の表示名だけ。ロール・テナント・運転可は admin が team API 経由で変えます
ドライバーマスター(/collector/drivers)は人としてのドライバーの台帳です。
- 本人が PWA から自己登録(氏名・免許・免許証画像)→ admin が承認の 2 段階。 却下されたら本人が直して再申請できます。承認済みの内容は本人からは変えられません
- 一覧は免許期限の 90 日以内 / 期限切れを明示します
- 免許証画像はテナント / 本人の 2 階層の非公開ストレージで、本人と admin だけが見えます
- 事故歴は admin 限定です(本人にも normal にも見せない)。ドライバー自身の申告 (ヒヤリハット)は運行日報側にあり、別物です
7. 気をつける点(実際に起きた不具合)¶
いずれも修正済みですが、同じ形を再導入しないための記録です。
越境で読める表に機密列を足して漏洩しました。 車両表には排出事業者向けの越境 SELECT が
あり、その下に台帳機密(保険・車台番号など)を追加した結果、他社の全ロールから読める状態に
なっていました。RLS は列を隠せないので、越境で読める表への列追加は「他社に見せてよいか」の
再評価が必須です(越境可の表の分類は AGENTS.md mig166 節に列挙。表の数え方は変わり得るため
ここに数は書かない)。
車番の表示が画面ごとに 4 通りに分裂しました。 同じ「車番の無い車両」が画面によって 違う文字で見えていたため、識別子は共通関数 1 箇所に集約しています。
回収先の同名ガードは、特殊な空白文字ですり抜けられました。 アプリ側の trim が落とす 空白の全集合(NBSP など約 15 種)を DB 側の正規化関数にも一致させています。片方だけ直すと また開きます。
normal の車両 CSV 取込が部分適用になっていました。 車両列は成功するのに許可エリア行だけ 権限エラーで落ちる状態でした。親子で書込権限を揃えます。
最後の管理者ガードが表示用ロールを見て空振りしそうになりました。 画面の role は
コピーでありドリフトし得ます。ガード・数え上げ・削除判定はすべて認証トークン側の値で行います。
7b. 期限アラート(ダッシュボード横断)¶
ダッシュボードの「期限アラート」タイルは、許可証(自社の収集運搬許可)・車検(active かつ構内機器でない車両)・免許(ドライバーマスター)の 3 カテゴリを横断して、期限超過または 60 日以内に期限を迎える項目を集計します(apps/web/src/lib/expiry-alerts.ts が単一権威・期限当日までは「接近」・翌日から「超過」)。タイルを押すと一覧ダイアログが開き、各行から該当画面(許可証 → 事業者プロフィール / 車検 → 車両一覧 / 免許 → ドライバー一覧)へ移動できます。
- 免許カテゴリは admin だけに表示されます(normal にはカテゴリも件数も出ません。ドライバーマスターの閲覧権限に合わせた設計)。
- 閾値はダッシュボード共通で 60 日です。ドライバーマスター一覧の免許バッジ(90 日)とは別画面・別閾値なので、免許は一覧側が先に色づきます。
8. 詳細はどこを見るか¶
| 知りたいこと | 参照先 |
|---|---|
| 機械が守る不変条件 | AGENTS.md の「回収先名の一意性」「越境露出の列スコープ」「Driver Master」「権限緩和」「Driver Mekata Units」 |
| 操作手順 | operations-manual/02-masters.md / 01-auth-team.md |
| 権限・ロールの全体像 | auth-permissions.md |
| 単価契約と精算の関係 | operations-manual/06-secondary-transport-pnl.md |
| 品目単位設定を使う目方入力 | weighing.md |
| 設計時の検討経緯 | superpowers/specs/(書き捨て・現行ではない) |