# 03_ui_design/03_02_master_management.md 版:v3.1 実装の状況は `work_order_db_migration.md`(作業書)を見る ## マスタ管理方式:B + C ハイブリッド ### 1. 基本方針 - マスタデータは全てDBのテーブルで保存し、画面はAPI経由で読み書きする(`00_07_database.md` 5.1節) - 通常は管理者画面で編集 - 入力時にも追加可能(便利さ優先) ### 2. 対象マスタ一覧 | マスタ | テーブル | 内容 | |--------|------------|------| | 拠点マスタ | `branches` | 本社、京都、大阪など(`01_11`) | | サテライト・管轄 | `satellites`、`branch_jurisdictions` | 担当エリアと、管轄する拠点(`01_11`) | | 部署マスタ | `departments`、`department_companies` | 調査部、経理部、営業部など(`01_06`) | | 職務ポジションマスタ | `positions`、`position_companies`、`position_default_permissions`、`position_rates` | 職務ポジション、使える会社、初期権限、報酬の率(`01_07`) | | 契約マスタ | `contracts`、`contract_companies` | 契約と、使える会社(`01_04`) | | 給与・報酬 | `salaries` | 直接雇用の給与(`01_08`)。従事者の画面から編集する | | 権限マスタ | `permissions`、`permission_ui_targets` | 権限、説明文、画面の部品との対応(`06_01`) | | 事業者情報 | `companies`、`company_detective_names` | 会社の基本情報(`02_03`) | | 案件種別マスタ | `case_types` | 案件種別(`04_01_03`) | | 勘定科目マスタ | `accounts`、`account_companies`、`sub_accounts` | 会計用科目(`07_07`) | ※ 顧客マスタおよび顧客区分マスタは営業管理(`clients/`)の管轄であるため、本表からは除外する(`02_data_definition/02_02_client_table.md` 参照)。 ### 3. 【方式B】管理者画面での編集 #### 画面構成 ``` 【管理メニュー(master/index.html)】 └ マスタ管理 ├ 拠点マスタ [編集](サテライト・管轄のタブを含む) ├ 部署マスタ [編集] ├ 職務ポジションマスタ [編集](初期権限、報酬の率を含む) ├ 契約マスタ [編集] └ 勘定科目マスタ [編集] 【営業管理(clients/index.html)】 └ 顧客マスタ管理 ├ 顧客情報 [編集] └ 顧客区分マスタ [編集] ← 顧客区分はここから管理する ``` #### 各マスタ編集画面の機能 - 一覧表示(テーブル形式) - 新規追加ボタン - 各行に編集ボタン・削除ボタン - 削除は論理削除(activeフラグをfalseにする) #### 削除の考え方 - 完全削除はしない(履歴保存のため) - active: true → 使用中 - active: false → 削除済(表示されない) ### 4. 【方式C】入力時追加 #### プルダウンの構造 ```html ``` #### 追加モーダルのイメージ ``` ┌─────────────────────┐ │ 新規拠点追加 │ ├─────────────────────┤ │ 拠点コード: [ ] │ │ 拠点名: [ ] │ │ 場所: [ ] │ ├─────────────────────┤ │ [キャンセル] [追加] │ └─────────────────────┘ ``` #### 追加後の処理 1. 入力値をバリデーション 2. マスタのテーブルに追加(変更履歴を同じトランザクションで記録) 3. プルダウンを再読み込み 4. 追加した項目が選択状態に ### 5. マスタデータの構造(例:拠点マスタ。APIの入出力の形) ```json { "branches": [ { "code": "01", "name": "本社", "location": "京都", "active": true }, { "code": "02", "name": "京都", "location": "京都", "active": true }, { "code": "03", "name": "大阪", "location": "大阪", "active": true } ] } ``` ### 6. 注意点 - コードは一度決めたら変更しない(履歴管理のため) - 名称は変更可能 - 削除(active: false)しても過去データは参照可能 - 新しいマスタが増えた場合も同じ方式で対応 ### 7. 今後の拡張 - マスタごとに異なる項目があっても対応可能 - 新しいマスタは、テーブルと編集画面を追加して対応する --- ## 8. master/index.html 仕様 ### 8.1 概要 マスタ管理の起点となるトップページ。 アクセス権限に応じてリンクブロックを表示制御する。 ### 8.2 アクセス権限 `permission_assign` を保有するユーザーのみアクセス可能。 権限なし = このページ自体にアクセス不可(login.html にリダイレクト)。 ### 8.3 画面構成 | ブロック | リンク先 | 表示に必要な権限 | |---------|---------|----------------| | 権限マスタ管理 | master/permission_edit.html | permission_assign | | 拠点マスタ管理 | master/branch_edit.html | permission_assign | | 部署マスタ管理 | master/department_edit.html | permission_assign | | 契約マスタ管理 | master/contract_edit.html | permission_assign | | 職務マスタ管理 | master/position_edit.html | permission_assign | | 事業者情報 | company_info.html | company_info_view | ※ 従事者マスタ管理の入口は、人事管理メニュー(`employees/admin_menu.html`)に一本化する。本画面からの導線は設けない(重複導線の回避)。 ### 8.4 権限制御方針 - 権限なし = リンクブロック自体を非表示 - 権限チェックはサーバーAPIから取得したユーザー情報で判定 - localStorage / sessionStorage 使用禁止 --- ## 9. permission_edit.html 仕様 ### 9.1 概要 権限マスタ(`permissions` テーブル)への権限の追加・編集・論理削除を 管理者が画面から行う。 ### 9.2 アクセス権限 `permission_assign` を保有するユーザーのみアクセス可能。 権限なし = login.html にリダイレクト。 ### 9.3 機能一覧 | 機能 | 内容 | |------|------| | 権限一覧表示 | テーブル形式。全件表示。active フィルタ切替あり(表示中のみ / 全件) | | 新規権限追加 | 権限ID・表示名・スコープ・レベル・カテゴリ・説明を入力 | | 既存権限編集 | 表示名・説明のみ変更可。権限IDは変更禁止 | | 論理削除 | active: false に変更。物理削除禁止 | ### 9.4 入力項目 | 項目 | 必須 | 備考 | |------|------|------| | 権限ID | ○ | 半角英数・アンダースコアのみ。登録後変更禁止 | | 表示名(日本語) | ○ | | | スコープ | ○ | self / team / branch / all | | レベル | ○ | 1(閲覧)/ 2(編集)/ 3(承認) | | カテゴリ | ○ | 経費 / 案件 / 従事者 / 会計 / 拠点間 / 会社アクセス / 事業者情報 / 労務 | | 説明 | - | 任意 | ### 9.5 保存API - エンドポイント: `POST /master/api/save_permission.php`(新規作成) - 新規: `created_at`・`created_by` を自動付与 - 編集: 表示名・説明のみ更新 - 論理削除: `active: false` に更新 ### 9.6 制約 - 権限IDは一度登録したら変更不可(履歴保存のため) - 物理削除は不可 - confirm() / alert() / prompt() 使用禁止。インライン表示で代替 - localStorage / sessionStorage 使用禁止 --- ## 10. 各マスタ編集画面 共通仕様(branch / department / contract / position) ### 10.1 共通機能 - 一覧表示(テーブル形式) - 新規追加 - 編集(コードは変更禁止、名称等は変更可) - 論理削除(active: false) - 保存先: `/master/api/save_[対象].php` - コードは自動で付ける(次の番号。`id_counters`)。職務ポジションは、カテゴリのブロックの次の番号 - 使える会社(`*_companies`)を、チェックボックスで選ぶ(部署、職務ポジション、契約、勘定科目) - 区分や種類のコード(DB の値)は2文字、画面では2文字目だけを表示する(`01_09`)。マスタ管理画面だけは、2文字のコードを表示する - **「履歴」ボタン**:押すと、その行(対象)の変更履歴を日付順に表示する(`00_10_change_history.md` 8節)。名称・住所・電話などの変更は、保存時に自動で履歴に記録される(区分は00_10 4節。人が「訂正/変更」を選ぶ操作は無い)。保存時、変更があった区分 A の項目について、有効日(任意)と理由(任意)を入力する欄を出す。履歴は読み取り専用(`change_history_view` が必要) ### 10.2 実装順序 従事者編集画面(`employees/edit.html`)でプルダウンとして参照されるため、 以下の順で先に実装する。 ``` ① branch_edit.html(拠点) ② department_edit.html(部署) ③ position_edit.html(職務) ④ contract_edit.html(契約) ``` ### 10.3 各マスタのデータ構造(APIの入出力の形。テーブルは `00_07_database.md` 5.1節) #### 拠点マスタ(`branches`) ```json { "branches": [ { "code": "K01", "id_part": "01", "name": "本社", "location": "京都", "active": true } ], "satellites": [ { "code": "S01", "name": "香川担当", "area": "香川県", "active": true, "jurisdiction": { "branch_code": "K01", "valid_from": "2026-11-01", "valid_to": null } } ] } ``` #### 部署マスタ(`departments`) ```json { "departments": [ { "code": "D00", "name": "管理部", "companies": ["SPS", "SCSPS"], "active": true } ] } ``` #### 職務マスタ(`positions`) ```json { "positions": [ { "code": "P001", "name": "代表取締役", "abbr": "CEO", "category": "役員", "companies": ["SPS", "SCSPS"], "default_permissions": ["permission_assign", "case_view_all"], "rates": [ { "investigator_rate": 60, "mentor_rate": null, "lodging_allowance": 5000, "document_level": "B+以上", "valid_from": "2026-04-01", "valid_to": null } ], "active": true } ] } ``` - `default_permissions` は `position_default_permissions`、`rates` は `position_rates`(業務委託で使う職務ポジションだけ)、`companies` は `position_companies`。権限の選択は、説明文つきのチェックボックス(`06_01`)。 #### 契約マスタ(`contracts`) ```json { "contracts": [ { "code": "C01", "name": "委任(役員)", "payment_type": "定期同額給与", "companies": ["SPS", "SCSPS"], "active": true } ] } ``` --- ## 11. 従事者管理画面仕様 従事者管理画面(`employees/index.html` および `employees/edit.html`)の画面仕様を定義する。 人事管理メニュー(`employees/admin_menu.html`)からリンクされ、従事者マスタ(`employees` ほか)の編集を行う。 ### 11.1 従事者一覧画面(employees/index.html) - **アクセス権限**: `profile_view_self` / `profile_view_branch` / `profile_view_all` / `permission_assign` のいずれか - **画面構成**: - ヘッダー: 人事メニュー(`employees/menu.html`)へ戻るリンク、タイトル「従事者一覧」、ユーザー名 - ツールバー: 件数表示 - テーブル: 従事者ID、氏名、所属(会社ごとの契約、職務ポジション、管轄拠点またはサテライト)、稼働状況 - 写真は一覧には表示しない。 - **登録・編集・削除ボタンは一切設置しない(閲覧専用)**。 - **動作**: - 初期表示時、`GET /employees/api/load_employee_list.php` を呼び出し一覧を描画。 - **一覧の出力**: 将来実装予定。出力項目は未決。 - **制約**: - localStorage / sessionStorage 使用禁止。 - 権限チェックは `session.js` の `window.hasPermission()` で行う(`06_01_permission_design.md` 5.3節)。 - データの表示は、`textContent` または無害化関数を使う。`innerHTML` に、データをそのまま入れてはならない(XSS対策)。 ### 11.2 従事者編集画面(employees/edit.html) - **アクセス権限**: `profile_edit_self` / `profile_edit_branch` / `profile_edit_all` のいずれか - **画面構成**: - **従事者の検索・選択欄**: 人事管理メニューから `sps_id` なしで開いた場合、まず検索・選択欄で対象の従事者を選ぶ。`sps_id` 付きで直接開いた場合は、検索・選択欄を省き、対象の従事者を直接読み込む。 - 基本情報: 氏名、氏名カナ、primary_company、稼働状況、メール、その他 - 所属: 会社ごとに1ブロック(会社の追加・削除ができる)。各ブロックに、契約、職務ポジション、部署、契約拠点、管轄拠点またはサテライトを入力する。会社を選ぶと、その会社で使える契約、職務ポジション、部署だけがプルダウンに出る。職務ポジションを選ぶと、初期権限を権限設定に入れるかを選べる(`01_07` 4節) - 管轄拠点とサテライトは、どちらか一方だけを入れる(`01_11`) - 住所: 郵便番号、住所都道府県、住所市区町村、住所町名、住所番地、建物名 - 写真: 従事者写真の表示・アップロード・差し替え - 権限設定: 権限マスタ(`permissions`)から `active` が真の権限をカテゴリ別に表示。チェックボックスでON/OFF。 - 保存ボタン、キャンセルボタン - **写真の仕様**: - 保存先: `/data/employees/photos/{SPS_ID}.jpg` - 画像形式: jpg固定(保存形式) - 表示: 個人確認画面(本画面)で表示。一覧では表示しない。 - アップロード: 「ファイル選択」ボタンで画像を選択し、保存時にアップロード。既存画像がある場合は差し替え。 - 画像がない場合はプレースホルダを表示する。 - 出力時(名簿等)の写真表示は未定(`08_pdf_engine` で定義予定)。 - **写真アップロードAPI(`upload_photo.php`)の仕様**: - エンドポイント: `POST /employees/api/upload_photo.php` - パラメータ: `sps_id`(必須)、`photo`(ファイル、必須) - 受け付ける形式: jpg、png。拡張子だけでなく、ファイルの中身が実際にjpgまたはpngであることをサーバー側で確認する - 保存形式: jpgに統一する。pngで受け付けた場合は、jpgに変換して保存する - 画像処理: 保存時に、長辺を縮小してjpgで再圧縮する(GDを使用。サーバーのGDは有効を確認済み)。再圧縮により、位置情報などの撮影情報は保存されない - 縮小後の長辺・jpg品質: **仮置き(長辺800px、品質85)。根拠なし。身分証・名簿の仕様(`08_pdf_engine`)が決まった時点で見直す** - サイズ上限: 受け取り10MB(スマホの原寸写真が通る値。サーバー側の `upload_max_filesize`、`post_max_size` はともに1Gで、制約にならないことを確認済み) - 権限チェック: `profile_edit_self` / `profile_edit_branch` / `profile_edit_all` のいずれか。対象従事者への編集権限があること(`save_employee.php` と同等の判定) - 保存先: `/data/employees/photos/{SPS_ID}.jpg`(既存があれば上書き) - エラー時の応答: HTTPステータスとメッセージをJSONで返す。画面側は**インラインでエラーを表示する**(`console.warn` で握りつぶさない)。 - **権限チェックUIの仕様(ペアリング制御)**: - `company_access_*_edit` がONになった場合、対応する `company_access_*` を自動的にONにし、チェックボックスを `disabled` にする(OFF不可)。 - `company_access_*_edit` がOFFになった場合、対応する `company_access_*` の `disabled` を解除する(チェック状態は保持)。 - `permission_assign` を持たないユーザーが操作する場合、すべての権限チェックボックスを `disabled` にし、その旨を画面に表示する。 - **保存時バリデーション**: - 氏名は必須。所属は、会社ごとに、契約、職務ポジション、契約拠点が必須。管轄拠点とサテライトは、どちらか一方。 - 権限ペアリングの最終チェック(`_edit` があるなら基本権限も必須)。 - サーバー側 `employees/api/save_employee.php` でも同等のチェックを行い、不一致なら403を返す。 - **データ取得**: - 検索・選択欄の候補は、`GET /employees/api/load_employee_list.php` から取得する。サーバー側で、呼び出し者の権限に応じて範囲を絞る(`profile_edit_self`:自分のみ、`profile_edit_branch`:同拠点、`profile_edit_all`:全員。`profile_view_*` の範囲との和集合)。連絡先は返さない。 - 初期表示時、`sps_id` が指定されていれば `GET /employees/api/load_employee.php?sps_id=xxx` を呼び出しデータを取得。指定がなければ検索・選択欄を表示し、対象選択後に取得する。 - **変更履歴**: - 画面に「履歴」ボタンを置く(`change_history_view` が必要。氏名・賞罰・権限の履歴は `change_history_view_sensitive` も必要)。 - 契約・氏名・所属会社・権限の変更は、保存すると「承認待ち」になり、確認者が承認するまで反映されない(`00_10_change_history.md` 4節 区分 B)。画面には「承認待ち」の表示を出す。 - 賞罰、昇進・降格は、項目の直接編集ではなく、「賞罰を登録」「昇進・降格を登録」ボタン(出来事の登録。00_10 4.1節)で行う。職務CDは、画面から直接は書き換えられない。 - 氏名は、保存時に「改姓・改名」のチェックを1つ付ける(チェック無しは訂正扱い)。 - **戻り先**: - ヘッダーの「← 戻る」リンク、およびキャンセルボタンは、人事管理メニュー(`employees/admin_menu.html`)に戻る。 - **制約**: - localStorage / sessionStorage 使用禁止。 - confirm() / alert() 使用禁止。インラインのメッセージ表示で代替する。 - データの表示は、`textContent` または無害化関数を使う。`innerHTML` に、データをそのまま入れてはならない(XSS対策)。 --- ## 12. 改訂履歴 | 日付 | 版 | 担当 | 内容 | 理由・影響範囲 | |------|----|------|------|--------------| | 2026-03-30 | 2.0 | マスタ管理担当(初代) | 8〜10節を新規追記、改訂履歴を11節に移設 | master/index.html・permission_edit.html・各マスタ編集画面の仕様策定。実装着手前の設計確定 | | 2026-10-08 | 2.1 | 全体管理者(12代目) | ファイル名規則を「フォルダ番号+ファイル番号」形式に変更したことに伴い、参照名と保存先表記を機械的に置換(内容の変更なし) | ファイル名規則変更(2026-10-08)。影響範囲:他設計書への参照名・保存先表記のみ | | 2026-10-24 | 2.2 | Deepseek | 8.3節の従事者マスタ管理のリンク先を `master/employees.html` から `employees/index.html` に修正(ツリーv2.16の配置に合わせる)。11節「従事者管理画面仕様」を新設し、`employees/index.html`(一覧)と `employees/edit.html`(編集)の画面構成、項目、バリデーション、権限チェックUI(ペアリング制御)を定義。これに伴い、改訂履歴の節番号を12節に繰り下げ | 従事者管理機能の実装に先立ち、画面UI仕様を確定させるため。影響範囲:`employees/index.html`、`employees/edit.html`、`master/index.html`(従事者管理カード追加) | | 2026-10-24 | 2.3 | Deepseek | 2節「対象マスタ一覧」および3節「画面構成」から顧客区分マスタを削除(営業管理 `clients/` 管轄へ移動)。10.2節「実装順序」から `client_type_edit.html`(顧客区分)を削除 | 顧客管理の仕様確定(`02_02_client_table.md` v2.0)に伴い、master管轄からclients管轄へ分離。マスタ管理の原則を全マスタで統一するため。 | | 2026-10-25 | 2.4 | Deepseek | 11.1節に「写真は一覧には表示しない」を追記。11.2節の画面構成に住所4分割と写真を追加し、写真の仕様(保存先 `/data/employees/photos/{SPS_ID}.jpg`、jpg形式、表示・アップロード・差し替え、プレースホルダ、出力時は `08_pdf_engine` で定義予定)を追記 | 従事者写真の表示・アップロード仕様の確定に伴う追記。影響範囲:`employees/edit.html`、`data/employees/photos/` | | 2026-10-26 | 2.5 | 全体管理者(13代目) | 11節の従事者APIのエンドポイントを `/master/api/…` から `/employees/api/…` に変更。11.1節の権限チェック方法を `window.spsUser.permissions` から `window.hasPermission()` に変更。11.2節のサーバー側 `save_employee.php` の表記を `employees/api/save_employee.php` に変更。10.2節の `employee_edit.html` を `employees/edit.html` に訂正 | 従事者系APIを `employees/api/` に集約する方針(`06_01_permission_design.md` v2.0)、および権限チェックを `window.hasPermission()` 経由に統一する方針(`06_01` 5.3節)への整合。影響範囲:`employees/index.html`、`employees/edit.html`の実装(呼び出し先のパス) | | 2026-10-26 | 2.6 | Deepseek(5代目) | 実装完了に伴い、11.1節の画面構成から「新規登録ボタン・編集リンク」の記述を削除(閲覧専用の確定)。11.1節のツールバーに「CSV出力ボタン」を明記 | 実ファイル移設(`employees/index.html`, `employees/edit.html`)およびAPI新設に伴う実装仕様の確定反映。影響範囲:`employees/index.html`、`employees/edit.html` | | 2026-10-27 | 2.7 | Deepseek(5代目) | ①8.3節から「従事者マスタ管理」ブロックを除き、入口を人事管理メニューに一本化。11節冒頭のリンク元を `employees/admin_menu.html` に変更。②11.1節からCSV出力ボタンを削除し、一覧出力は将来実装・出力項目未決とメモ。③11.2節から新規登録の記述を削除し、登録は `register.html` と明記。④11.2節に従事者の検索・選択欄を追加(`sps_id` なしの場合は検索・選択、付きの場合は省略)。⑤11.2節の戻り先を人事管理メニューに変更。⑥11.2節に `upload_photo.php` の仕様(メソッド・パラメータ・jpgのみ・サイズ上限案・権限チェック・保存先・エラー時のインライン表示)を追加。⑦11.1節・11.2節の制約に、`innerHTML` へのデータ直接挿入禁止(`textContent`または無害化関数の使用)を追加 | 差し戻し指示(全体管理者14代目)2.1節#1〜#8の反映。影響範囲:`employees/index.html`、`employees/edit.html`、`employees/api/upload_photo.php`、`master/index.html` | | 2026-10-27 | 2.8 | 全体管理者(14代目) | v2.7の審査に伴う修正。①11.1節に「登録・編集・削除ボタンは一切設置しない(閲覧専用)」を復元(v2.7で脱落)。②11.1節のヘッダーの戻り先をTOPから人事メニューに変更。③11.2節に、検索・選択欄の候補の取得元(`load_employee_list.php`)と権限別の範囲を追記。④`upload_photo.php` に、中身がjpgであることのサーバー側確認を追記 | v2.7の漏れ・未定義の補正。影響範囲:`employees/index.html`、`employees/edit.html`、`employees/api/load_employee_list.php` | | 2026-10-27 | 2.9 | 全体管理者(14代目) | 11.2節の `upload_photo.php` の仕様を変更。①受け付ける形式をjpgのみからjpg・pngに変更し、保存はjpgに統一(png受付時は変換)。②保存時にGDで縮小・再圧縮する処理を追加。縮小後の寸法は仮置き(長辺800px、品質85)と明記。③サイズ上限を「5MB(案)」から、実測に基づく「受け取り10MB」に変更 | サーバーのPHP設定を実測(`upload_max_filesize`・`post_max_size`・`memory_limit` は1G、GD有効)。影響範囲:`employees/api/upload_photo.php`(未実装)、`employees/edit.html` | | 2026-10-29 | 2.10 | 全体管理者(14代目) | 10.1節に「履歴」ボタンと保存時の有効日・理由の入力欄を追記。11.2節に変更履歴の項(区分Bの承認待ち、出来事の登録ボタン、改姓・改名のチェック)を追記 | 変更履歴仕様(00_10 v1.0、真柴さん承認)の反映。影響範囲:各マスタ編集画面、`employees/edit.html`。拠点項目の拡張(旧予定の v2.10)は別の版で行う | | 2026-10-29 | 3.0 | 全体管理者(14代目) | DB前提に書き直し。マスタの保存先をJSONファイルからテーブルに(1節、2節、9.1節、10.3節、11節)。実装の状況は作業書を見る旨を先頭に追記 | 仕様書をDB前提に統一(作業書 J-02)。拠点項目の拡張は、作業書 E-02 | | 2026-10-30 | 3.1 | 全体管理者(14代目) | 2節の対象マスタを確定(サテライト・管轄、契約、権限、事業者情報、案件種別を追加)。職務マスタを「職務ポジション」に。10.1節にコードの自動付与、使える会社、2文字コードの扱いを追記。10.3節のデータ構造を更新(職務ポジションに略称・使える会社・初期権限・報酬の率、拠点にサテライト)。11節:従事者の所属を会社ごとのブロックに | 真柴さんの指示。影響範囲:`01_04`、`01_06`、`01_07`、`01_11`、`02_01`、`employees/edit.html`、`employees/index.html` |