# 06_permission/01_permission_design.md ## 1. 権限設計の基本方針 ### 1.1 大前提 - **権限は全て個人に付与する** - 役職は「デフォルト値の参考」に過ぎない - 同じ役職でも個人ごとに権限が異なる - 権限情報は従事者マスタ(employees.json)の permissions フィールドで一元管理する - ログイン時は従事者マスタから権限を取得する - ダッシュボードの統計情報は、選択中の会社(会社切替プルダウン)に連動して表示を切り替える - アクセス可能な会社が2つ以上ある場合、統計情報は会社ごとに集計して表示する ### 1.2 権限の対象範囲 | 範囲コード | 説明 | 例 | |------------|------|-----| | self | 自分のデータのみ | 自分の経費 | | team | 同じ案件グループ | 同じ案件のメンバー | | branch | 同じ拠点全体 | 本社の全案件 | | all | 全社(全拠点) | 全てのデータ | ### 1.3 権限のレベル | レベル | 名称 | 動作 | |--------|------|------| | 0 | なし | メニュー非表示 | | 1 | 閲覧のみ | 画面表示、編集不可 | | 2 | 編集可 | 編集可能 | | 3 | 承認可 | 承認操作可能 | ### 1.4 権限の付与フロー 権限管理は以下の3段階で移行する。 | フェーズ | 操作方法 | |---------|---------| | 仮運用 | employees.jsonの「権限」フィールドに直書き | | 暫定運用 | login.php実装後・画面なしで動く(employees.jsonをそのまま参照) | | 本運用 | employee_edit.htmlで従事者ごとにチェックボックスで設定・保存時にemployees.jsonを上書き | - 権限の付与・変更・剥奪は `employee_edit.html` のチェックボックスから行う - 保存時に `employees.json` の「権限」フィールドを**上書き**する - `login.php` / `get_session.php` は常に `employees.json` の「権限」を読むだけ(フェーズが変わっても変更不要) - `permissions.json` は権限IDと表示名の定義マスタ。`employee_edit.html` のチェックボックス生成に使用する ### 1.5 権限変更の即時反映 - `employee_edit.html` で権限を変更・保存した場合、対象ユーザーのPHPセッションを強制破棄する - 対象者は次のリクエスト時に再ログインを求められ、新しい権限が即時反映される - 詳細は `00_overview/03_login_session.md` 6節参照 --- ## 2. 権限一覧(現時点) ### 2.1 経費関連権限 | 権限ID | 説明(日本語) | 対象範囲 | レベル | |--------|----------------|----------|--------| | expense_view_self | 自分の経費を閲覧する | self | 1 | | expense_edit_self | 自分の経費を編集する | self | 2 | | expense_approve_self | 自分の経費を承認する | self | 3 | | expense_view_team | チームの経費を閲覧する | team | 1 | | expense_edit_team | チームの経費を編集する | team | 2 | | expense_approve_team | チームの経費を承認する | team | 3 | | expense_view_branch | 自拠点の経費を閲覧する | branch | 1 | | expense_edit_branch | 自拠点の経費を編集する | branch | 2 | | expense_approve_branch | 自拠点の経費を承認する | branch | 3 | | expense_view_all | 全経費を閲覧する | all | 1 | | expense_edit_all | 全経費を編集する | all | 2 | | expense_approve_all | 全経費を承認する | all | 3 | ### 2.2 案件関連権限 | 権限ID | 説明(日本語) | 対象範囲 | レベル | |--------|----------------|----------|--------| | case_view_self | 自分の案件を閲覧する | self | 1 | | case_edit_self | 自分の案件を編集する | self | 2 | | case_view_team | チームの案件を閲覧する | team | 1 | | case_edit_team | チームの案件を編集する | team | 2 | | case_view_branch | 自拠点の案件を閲覧する | branch | 1 | | case_edit_branch | 自拠点の案件を編集する | branch | 2 | | case_view_all | 全案件を閲覧する | all | 1 | | case_edit_all | 全案件を編集する | all | 2 | | case_delete | 案件を削除する | all | 2 | | investigator_add | 調査員を追加する | team | 2 | ### 2.3 従事者関連権限 | 権限ID | 説明(日本語) | 対象範囲 | レベル | |--------|----------------|----------|--------| | profile_view_self | 自分のプロフィールを閲覧する | self | 1 | | profile_edit_self | 自分のプロフィールを編集する | self | 2 | | profile_view_branch | 自拠点の従事者を閲覧する | branch | 1 | | profile_edit_branch | 自拠点の従事者を編集する | branch | 2 | | profile_view_all | 全従事者を閲覧する | all | 1 | | profile_edit_all | 全従事者を編集する | all | 2 | | permission_assign | 権限を付与する | all | 2 | ### 2.4 会計関連権限 | 権限ID | 説明(日本語) | 対象範囲 | レベル | |--------|----------------|----------|--------| | accounting_view | 会計データを閲覧する | all | 1 | | accounting_edit | 会計データを編集する | all | 2 | | accounting_export | 会計データを出力する | all | 2 | | accounting_approve | 会計データを承認する | all | 3 | ### 2.5 拠点間権限 | 権限ID | 説明(日本語) | 対象範囲 | レベル | |--------|----------------|----------|--------| | branch_cross_view | 他拠点のデータを閲覧する | all | 1 | | branch_cross_edit | 他拠点のデータを編集する | all | 2 | | branch_cross_approve | 他拠点のデータを承認する | all | 3 | ### 2.6 会社アクセス権限 | 権限ID | 説明(日本語) | 対象範囲 | レベル | 備考 | |--------|----------------|----------|--------|------| | company_access_sps | 個人事業(SPS)にアクセスできる | all | 1 | 閲覧のみ | | company_access_sps_edit | 個人事業(SPS)を編集できる | all | 2 | 編集可 | | company_access_scsps | 法人(SCSPS)にアクセスできる | all | 1 | 閲覧のみ | | company_access_scsps_edit | 法人(SCSPS)を編集できる | all | 2 | 編集可 | ### 2.7 事業者情報関連権限 | 権限ID | 説明(日本語) | 対象範囲 | レベル | |--------|----------------|----------|--------| | company_info_view | 事業者情報を閲覧する | all | 1 | | company_info_edit | 事業者情報を編集する | all | 2 | ### 2.8 労務関連権限 | 権限ID | 説明(日本語) | 対象範囲 | レベル | |--------|----------------|----------|--------| | labor_view | 労務情報を閲覧する | all | 1 | | labor_social_insurance_export | 社会保険CSVを出力する | all | 2 | | labor_year_end_adjustment | 年末調整を行う | all | 2 | ### 2.9 ログイン時TOPページ振り分けルール - ユーザーの「現在契約CD」と付与された会社アクセス権限に基づき、ログイン後のTOPページを決定する - アクセス可能な会社が1つの場合は、その会社のTOPページを直接表示(会社切替なし) - アクセス可能な会社が2つの場合は、会社切替プルダウン付きTOPページを表示 - アクセス可能な会社がない場合は、エラーページを表示 --- ## 3. 管理者フラグ(isAdmin) ### 3.1 概要 管理者フラグは通常業務権限(`permissions.json`)とは**別枠の特別権限**。 業務上の役割に応じて変動する通常権限と異なり、システム管理者としての資格を表す。 | 区分 | 管理場所 | 用途 | |------|---------|------| | 通常業務権限 | permissions.json(定義)/ employees.json(付与状態) | 業務上の操作権限 | | 管理者フラグ | users.json(isAdminフィールド) | 緊急時・システム管理用 | ### 3.2 isAdmin: true の効力 - `employees.json` の稼働状況チェックをスキップしてログイン可能 - 緊急ロック中・退職・解雇状態でもシステムに入れる - 緊急ロック中・退職者の従事者詳細を閲覧・編集可能(アクセスログに記録) - 初期状態では真柴直也(SPS01-00001)のみ `isAdmin: true` ### 3.3 admin_flag_assign 権限 - `isAdmin` の付与・剥奪ができる権限 - `employee_edit.html` の専用セクションから操作(通常の権限チェックボックスとは分離) - 初期状態では真柴直也のみ保有 --- ## 4. 権限の追加・修正方法 ### 4.1 新規権限追加の流れ 1. 管理者が「権限マスタ管理画面」を開く 2. 「新規権限追加」ボタンをクリック 3. 以下の項目を入力 - 権限ID(半角英数、例: expense_approve_team) - 表示名(日本語) - 対象範囲(self/team/branch/all) - レベル(1/2/3) - 説明(任意) 4. 「追加」をクリック 5. 権限マスタに自動追加 6. 従事者入力画面のチェックボックス一覧に表示される ### 4.2 権限修正の流れ - 表示名の変更は可能 - 権限IDは変更しない(履歴保存のため) - 削除は「論理削除」(active: false) ### 4.3 権限マスタのデータ構造 ```json { "permissions": [ { "id": "expense_approve_team", "name": "チームの経費を承認する", "scope": "team", "level": 3, "active": true, "created_at": "2024-03-11", "created_by": "SPS01-00001", "description": "チームメンバーの経費を承認できる" } ] } ``` --- ## 5. 従事者マスタでの権限管理 ### 5.1 チェックボックス形式(日本語表示) ``` 【従事者権限設定】 SPS01-00001 真柴直也 ■ 経費関連 □ 自分の経費を閲覧する □ 自分の経費を編集する ...(以下略) ■ 管理者設定(admin_flag_assign保有者のみ表示) □ 管理者フラグ(isAdmin) ``` ### 5.2 保存形式(JSON) ```json { "SPS_ID": "SPS01-00001", "氏名": "真柴 直也", "権限": { "expense_view_self": true, "company_info_view": true, "permission_assign": true } } ``` 保存場所: `/master/employees.json`(従事者マスタ内) --- ## 6. 運用開始後の考え方 - **完璧を目指さない** - 運用しながら現場の声を聞く - 必要に応じて権限を追加・修正 - 使わない権限は無効化(削除しない) --- ## 7. 今後の拡張 - 新しい機能ができたら権限IDを追加 - 既存の権限IDは削除せず無効化 - 履歴を残す --- ## 8. 職務別デフォルト権限セット ### 8.1 概要 - 新規従事者登録時の初期権限を、職務コードに応じて自動設定する - デフォルト権限セットは **positions.json** で管理する - 設定後は個人単位で権限の追加・削除が可能 ### 8.2 デフォルト権限セットの例 ```json { "positions": [ { "code": "P001", "name": "代表取締役", "category": "役員", "default_permissions": [ "company_access_sps", "company_access_sps_edit", "company_access_scsps", "company_access_scsps_edit", "case_view_all", "case_edit_all", "accounting_view", "accounting_edit", "permission_assign", "company_info_view", "company_info_edit", "labor_view", "labor_social_insurance_export" ] }, { "code": "P014", "name": "初級調査員", "category": "調査職", "default_permissions": [ "case_view_self", "expense_view_self", "expense_edit_self" ] } ] } ``` --- ## 9. 兼任者の権限 - 複数の会社に所属する従事者は、それぞれの会社に対する権限を個別に付与する - 例:法人では経理権限、個人事業では案件閲覧権限など - ログイン時は従事者マスタの「所属」フィールドに基づいてアクセス可能な会社を判定し、権限を適用する --- ## 10. データ保存場所一覧 | ファイル | 保存場所 | 内容 | |---------|---------|------| | 従事者マスタ | `/master/employees.json` | 従事者情報 + 権限付与状態 | | 権限マスタ | `/master/permissions.json` | 権限定義一覧 | | ログインユーザー | `/master/users.json` | パスワード情報 + isAdminフラグ | | アクティブセッション | `/data/sessions/active_sessions.json` | セッションID管理(強制破棄用) | --- ## 11. 改訂履歴 | 日付 | 版 | 担当 | 内容 | 理由・影響範囲 | |------|----|------|------|--------------| | 2026-03-11 | 1.0 | 全体管理者 | 初版作成 | | | 2026-04-04 | 1.1 | マスタ管理担当(2代目) | 1.4節追加(権限付与フロー・移行フェーズ)、1.5節追加(権限変更の即時反映)、3節新設(isAdmin・admin_flag_assign)、5.1節に管理者設定セクション追記、10節にactive_sessions.json追加 | 打ち合わせ確定事項の反映:権限付与フロー・isAdmin・admin_flag_assign・即時反映 |