コンテンツにスキップ

マスタ管理(現行仕様)

読む順: この 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/書き捨て・現行ではない