役割・権限
位置づけ: 新CRM全体設計
先行リリース第1弾(催事・アイテム・商社(卸))の権限は、社内4ロール・外部3ロールの計7ロールで構成するRBAC(ロールベースアクセス制御)で管理する。実装の正本は crm_app/app/src/lib/permissions.ts であり、画面(nav)単位の表示制御と、列・操作単位の可否関数(canSeeCost等)の2層で権限を判定する。
顧客/商談CRM・見積・KPI予実領域の権限(所属・権限スコープ4段・職能ロールの3軸設計)は 役割・権限(全体設計) が扱う。本ページはそのうち先行リリース範囲で実装済みの lib/permissions.ts を対象とする。決定事項の正本は 定例会ログ であり、両者に差異がある場合は定例会ログを優先する。
スコープ・対象
Section titled “スコープ・対象”対象は催事・アイテム(商品マスタ)・商社(卸)の3モジュール。顧客/商談CRM・見積・KPI予実の権限は対象外とし、役割・権限(全体設計) 側で扱う。フェーズ区分の詳細は スコープ・フェーズ分け を参照。
Role 型は7値。社内4ロールと外部3ロールに分かれ、「社内/代理店」の単純な2値ではない。
| ロール | 区分 | 想定ユーザー像 | 主な責務 |
|---|---|---|---|
| 管理者 | 社内 | 本部・システム管理者 | 全画面・全操作・マスタ管理 |
| 営業 | 社内 | 催事・案件を担当する営業 | 案件・顧客・商談結果、催事シフト作成編集(発注・申請・架電は対象外) |
| 事務(BO) | 社内 | バックオフィス | 架電・審査・書類・施工・発注・申請・卸(wholesale)・マスタまで最も広い実務範囲 |
| 発注・申請担当 | 社内 | 発注・申請の実務担当 | 発注(/orders)・申請(/applications)・案件閲覧に限定 |
| 代理店 | 外部 | 代理店側の管理者 | 自社経由案件と自社の催事シフト。仕切原価は非表示、提案金額は閲覧可 |
| 代理店(メンバー) | 外部 | 代理店の現場スタッフ | 自社の催事シフト閲覧と開始/終了報告のみ |
| 施工店 | 外部 | 施工パートナー | 担当案件の施工・チャットのみ(催事・アイテム・卸は対象外) |
催事スタッフは独立ロールにせず「代理店(メンバー)」に統合する。個人スタッフはアカウント管理せず、責任者名の文字列と人数のみで管理する方針と整合させる。EventCompany.business(催事/訪販/催事・訪販)は代理店の属性でありロールではないため、権限判定には用いない。
1ユーザーが複数ロールを兼務できるかは確認事項とする。現行実装は1ユーザー=1ロール(サイドバーの表示ロール切替によるデモ運用)を前提とする。
権限モデルの基本方針
Section titled “権限モデルの基本方針”- テナント境界: 社内ロールは全代理店のデータを横断閲覧する。代理店ロールは
eventScopeAgency()により自社(companyId/代理店名一致)にスコープする。 - 編集権は原則社内ロールのみに付与する。外部(代理店)には催事の開始/終了報告のみを書き込み許可するadd-only型の設計とする(
canManageShiftsは管理者・営業・事務(BO)のみtrue)。 - 権限の適用単位はロールベース(RBAC)とし、「画面(nav)単位の表示制御」と「列・操作単位の可否関数」の2層で構成する。
- 仕入原価・粗利(
canSeeCost)は外部ロール(代理店・代理店(メンバー)・施工店)に非公開とする。提案金額(canSeeProposal)は施工店と代理店(メンバー)のみ非公開とし、代理店は販売当事者として提案金額まで閲覧できる。社内ロール間(管理者・営業・事務(BO)・発注・申請担当)では金額の絞り込みを行わず、全員が原価を閲覧できる。 - アイテムはフィールド単位の変更履歴(before/after)を
/master-historyで管理する。変更者(ユーザー紐付け)の記録はログイン実装後に対応する。 - マスタの編集可否・催事の開始/終了報告の入力可否は、本ページの各表がUI上の想定ポリシーとして示すものであり、それを強制するロールガードは現状未実装である。
useRole(表示ロール切替)は変更履歴のactor記録に使うのみで、編集操作自体をブロックする機能を持たない。実装までは運用ルール(周知手順)で統制し、ロールガードの実装は今後の対応とする。 - 2026-07-22定例会では「代理店の管理者/メンバーは機能差ほぼ無し(枠だけ用意)」とされたが、実装段階では
NAV_ALLOW(代理店=/deals・/customers・/chat・/events/代理店(メンバー)=/eventsのみ)、visibleDealTabs(代理店=5タブ/代理店(メンバー)=3タブ)、canSeeProposal(代理店(メンバー)のみ非公開)で明確な差分が生じている。7/22時点の想定と実装の差異は確認事項とする。
案件(Deal)閲覧範囲・タブ・チャットスコープ(対象外・要点のみ)
Section titled “案件(Deal)閲覧範囲・タブ・チャットスコープ(対象外・要点のみ)”案件(Deal)の閲覧範囲・詳細タブ・チャットルームの可視スコープは、顧客/商談CRM本体の権限であり本ページ(催事・アイテム・商社(卸)の第1弾スコープ)の対象外である。詳細・正本は 役割・権限(全体設計) に委譲する。visibleDeals / visibleDealTabs / visibleScopes はChannel(訪問販売/催事/反響/パートナー)を横断するCRM本体の権限関数であり、催事チャネルに閉じたものではない。
第1弾に関わる範囲の要点のみ以下に記す。
- 管理者・営業・事務(BO)・発注・申請担当は全件・全8タブ(概要・タスク・アイテム・工程・契約後・申請・チャット・活動)・社内/施工店/代理店の全チャットスコープを閲覧できる。
- 代理店は自社(代理店名一致)経由の案件のみを閲覧でき、詳細タブは概要・アイテム・工程・チャット・活動の5タブ、チャットスコープは代理店に限定される。
- 代理店(メンバー)は
/dealsのnavが非公開であり、案件は催事シフト経由の情報のみ参照する。詳細タブは概要・工程・チャットの3タブに限定される。 - 施工店は施工が開始している担当案件のみを閲覧でき、詳細タブは概要・工程・チャットの3タブ、チャットスコープは施工店に限定される。
レイアウト前提も権限とあわせて分岐する。営業・代理店・代理店(メンバー)・施工店はモバイル前提の現場ロール、管理者・事務(BO)・発注・申請担当はPC前提のコア運営ロールとする。
催事モジュールの操作可否
Section titled “催事モジュールの操作可否”| 操作 | 管理者 | 営業 | 事務(BO) | 発注・申請担当 | 代理店 | 代理店(メンバー) |
|---|---|---|---|---|---|---|
| シフト(EventShift)作成・編集・削除 | ○ | ○ | ○ | × | × | × |
| 開始報告(朝礼)・終了報告(現場ファネル)入力 | × | × | × | × | ○ | ○ |
| ShiftStatus(予定/開始済み/終了済み/未開始/終了未報告)の手動変更 | × | × | × | × | × | × |
自社シフト閲覧(/events) | ○ | ○ | ○ | × | ○(自社のみ) | ○(自社のみ) |
| 店舗(EventStore)・代理店(EventCompany)マスタ画面の閲覧 | ○ | ○ | ○ | × | × | × |
| 上記マスタの編集 | ○ | × | ○ | × | × | × |
| 催事↔商談の突合結果の閲覧 | ○ | ○ | ○ | × | × | × |
ShiftStatusは基準時刻からの自動導出のため、どのロールも手動変更できない。店舗・代理店マスタの編集権は管理者と事務(BO)に付与する想定だが、これを強制するロールガードは未実装であり運用ルールで統制する(上記「権限モデルの基本方針」参照)。営業への編集権開放(画面自体は営業にも表示済み)は確認事項とする。内部ロールが代理店に代わって開始/終了報告を代行入力する機能は実装しておらず、対応の要否は確認事項とする。代理店(メンバー)には自社の全シフトを表示する(担当シフトのみへの絞り込みは採らない)。
アイテム(商品マスタ)モジュールの操作可否
Section titled “アイテム(商品マスタ)モジュールの操作可否”/master-products 等のマスタ画面は管理者と事務(BO)のみに開放する。営業は /master-history(変更履歴)のみアクセスでき、発注・申請担当はアイテムマスタ関連画面に一切アクセスできない。
| 操作 | 管理者 | 営業 | 事務(BO) | 発注・申請担当 | 代理店 |
|---|---|---|---|---|---|
| Product(型番/kind/maker/spec等)の画面閲覧 | ○ | × | ○ | × | × |
| Product編集 | ○ | × | ○ | × | × |
| 在庫(潤沢/少/欠品)・納期(leadTimeDays)更新 | ○ | × | ○ | × | × |
| 周辺マスタ(Series/Supplier/Vendor/LoanCompany/Manufacturer)編集 | ○ | × | ○ | × | × |
変更履歴(/master-history、フィールド単位before/after)閲覧 | ○ | ○ | ○ | × | × |
Series・催事は変更履歴の対象外とする(プロダクト全体仕様)。外部ロール(代理店)へのアイテム公開は第1弾では行わない(在庫・納期の代理店向け公開は将来拡張の対象)。価格は商品マスタに持たず卸金額(CRM)側で保持するため、アイテムマスタの権限は原価情報を含まず単純化されている。営業・発注・申請担当へのアイテムマスタ本体の開放範囲は確認事項とする。上表のProduct編集可否も、店舗・代理店マスタと同様にロールガード未実装のため運用ルールで統制する。
商社(卸)モジュールの操作可否と工程担当
Section titled “商社(卸)モジュールの操作可否と工程担当”/wholesale のnav可視性は管理者と事務(BO)のみとする。営業・発注・申請担当・代理店3ロールはいずれも画面非表示とする。工程STEP単位の担当ロール紐付けは lib/permissions.ts には実装しておらず、ドメイン設計(WholesaleTask.assignee等)側の対応関係として管理する。
| 工程STEP | 想定担当 | 掛売 | 三社間 | カード | 前金 | その他 |
|---|---|---|---|---|---|---|
| settlement(決済条件確定) | 経理 | ○ | - | - | ○ | ○ |
| approval(承認番号確認) | 経理 | - | ○ | ○ | - | - |
| prepay(前金請求入金) | 経理 | - | - | - | ○ | - |
| order(商社・メーカーへ発注) | 発注担当 | ○ | ○ | ○ | ○ | ○ |
| deliver(納品確認) | 発注担当 | ○ | ○ | ○ | ○ | ○ |
| invoice(販売店へ請求) | 経理 | ○ | - | - | - | ○ |
| payment(入金消込) | 経理 | ○ | ○ | ○ | - | ○ |
「想定担当」は実装 lib/wholesale.ts の STEP_META.assignee に準拠する自由文字列(経理/発注担当)であり、Role 型の値そのものではない。経理は事務(BO)、発注担当は発注・申請担当に対応すると想定されるが、現行ロールには /wholesale のnavアクセスがない。ロール名と画面権限の不一致は確認事項とし、発注・申請担当に /wholesale を開放するか事務(BO)に一本化するかを決める。前金(FLOW: [settlement, prepay, order, deliver])はinvoice・payment工程を持たない点に注意する(三社間・カードも請求工程invoiceを持たない)。決済区分(前金/掛売/三社間/カード/その他)ごとのSTEP_ORDER分岐はドメイン仕様として定義済みだが、権限側とは未接続である。
卸金額(WholesalePrice: 仕入価格・卸価格・反映日)の登録・編集、WholesaleTask(未対応/対応中/完了、担当者・期限・優先度)の作成・アサインは、事務(BO)・発注・申請担当・管理者に限定する設計上の想定である。ただし現行実装(lib/wholesale.ts)は発注フォーム・案件操作に認証・権限ガードを持たず、社内(VE)担当による代行入力を前提に動作する。これらの制限は未実装であり、実際のガード実装は今後の対応とする。営業への閲覧範囲開放は確認事項とする。DealerIntakeForm(販売店発注フォーム)は外部の販売店が入力し案件化される唯一の外部起点であり、代理店ロールとは別枠のアクセス経路とする。アクセス方式(認証なしフォームか専用トークンURLか)は確認事項とする。
別軸案件(元請=販売店の deals と分離、将来分社化を視野)のため、卸モジュール全体を社内でも権限で閉じられる構造にする。現状のnav絞り込みはこの方針と整合する。
画面・ナビゲーションと権限の対応
Section titled “画面・ナビゲーションと権限の対応”NAV_ALLOW を第1弾3モジュールに絞って整理する。
| 画面 | 管理者 | 営業 | 事務(BO) | 発注・申請担当 | 代理店 | 代理店(メンバー) | 施工店 |
|---|---|---|---|---|---|---|---|
/events(催事シフト) | ○ | ○ | ○ | × | ○ | ○ | × |
/events/stores, /events/companies(店舗・代理店マスタ) | ○ | ○ | ○ | × | × | × | × |
/master-products 等(アイテムマスタ本体) | ○ | × | ○ | × | × | × | × |
/master-history(変更履歴) | ○ | ○ | ○ | × | × | × | × |
/wholesale(商社・卸) | ○ | × | ○ | × | × | × | × |
マスタ画面はMasterScreen定型(テーブル+ドロワー+変更履歴)に統一する。編集権のないロールにはドロワーを閲覧専用で表示する。金額カラム(仕入・卸価格)は該当列自体を消す方式(canSeeCost)を採用し、マスキング表示(***)は採らない。権限外URLへの直アクセス時の挙動(404型で存在を隠すか403型で権限不足を示すか)は確認事項とする。
招待制ログインとアカウントライフサイクル
Section titled “招待制ログインとアカウントライフサイクル”第1弾では認証基盤・招待フローは未着手であり、サイドバーの「表示ロール(デモ)」スイッチで7ロールを手動切替してデモする段階にある。
本実装では自己登録なしの完全招待制とする。管理者が社内メンバーと代理店を招待する。招待フローはメール招待→初回パスワード設定→ロール自動付与(招待時に指定)の3ステップとする。代理店の契約終了時は一括無効化し、過去の開始/終了報告データは保持する。
代理店に自社メンバー(代理店(メンバー))の招待権を付与するか、本部管理者のみが招待する一本化にするかは確認事項とする。認証基盤の選定、パスワードリセット・多要素認証・セッション有効期限などのセキュリティ要件も確認事項とする。
- 発注・申請担当に
/wholesaleを開放するか、事務(BO)に一本化するか。 - 営業・発注・申請担当へアイテムマスタ本体を開放する範囲(参照のみ/編集込み/現状維持)。
- 卸金額(仕入原価)の社内閲覧範囲を事務(BO)・管理者限定のままとするか、営業にも開放するか。
- 催事スタッフを将来個人アカウント化するか、責任者名+人数のまま維持するか。
- 代理店に自社メンバーの招待権を付与するか、本部管理者のみに一本化するか。
- 担当外STEPの操作を通知にとどめるか、ハードブロックにするか。
- 内部ロールによる開始/終了報告の代行入力を実装するか。
- 1ユーザーが複数ロールを兼務できるか(例: 事務(BO)と発注・申請担当)。
- 店舗・代理店マスタの編集権を営業にも開放するか。
- DealerIntakeFormへの外部起点アクセス方式(認証なしフォーム/専用トークンURL)。
- 権限外URLへの直アクセス時の挙動(404型/403型)。
論点の一次情報・詳細な背景整理は 未確定事項一覧 側に展開する。本ページの一覧はそのうち催事・アイテム・商社(卸)領域の抜粋である。
- 役割・権限(全体設計) — 所属/権限スコープ/職能ロールの3軸によるCRM全体の権限設計。
- 定例会ログ — 決定事項の正本。
- 未確定事項一覧 — 論点の一次情報。
- スコープ・フェーズ分け — フェーズ区分の詳細。