# 05_employee_management/05_04_employee_directory.md 版:v1.4 実装の状況は `work_order_db_migration.md`(作業書)を見る ## 1. 概要 担当者一覧(受電用)。 受電・事務担当者が、名指しされた従事者の稼働状況・連絡先を確認し、必要に応じてその場でメール送信するための画面。 ## 2. 画面構成 - ファイルパス: `employees/directory.html` - 検索バー: 氏名・カナ・SPS_IDで名指し検索 - テーブル項目: **氏名(先頭)**、所属、稼働状況(有給中・休業中など)、連絡先(電話・メール) - **選択時の動作**: 行をクリックすると、詳細(モーダルまたは別枠)が開き、稼働状況・連絡先が確認できる。 - **メール送信機能**: 詳細画面内に「件名」「本文」の入力欄と「送信」ボタンを配置。送信時は `send_mail.php` を叩く。 ## 3. API仕様 ### 3.1 担当者一覧専用API - **エンドポイント**: `GET /employees/api/load_directory_list.php`(名称案) - **権限要件**: `employee_directory_view` または `supreme_access` - **サーバー側チェック**: `employee_directory_view` を確認する。 - **レスポンス**: 氏名、カナ、所属、稼働状況、電話、メールを含む。 - **備考**: `load_employee_list.php` は連絡先を返さない。連絡先を含む一覧は、本APIに分離する。 ### 3.2 メール送信API(`send_mail.php`) - **エンドポイント**: `POST /employees/api/send_mail.php` - **権限要件**: `employee_directory_view` または `supreme_access`(ボタン単位の権限は増やさない方針) - **リクエストボディ**: `{ "to_sps_id": "SPS01-99999", "subject": "ご連絡", "body": "..." }` - **宛先の解決**: `to_sps_id` からサーバー側でメールアドレスを解決する。クライアントからアドレスを直接受け取らない。 - **ヘッダーインジェクション対策**: 件名・本文に改行文字(`\r`、`\n`)が含まれる場合は拒否する、または除去する。 - **入力の制限(案)**: 件名は100文字まで、本文は2000文字まで。空の件名・本文は拒否する。 - **送信元アドレス(案)**: - `From` は、会社のドメインの**固定の送信用アドレス**とする。アドレスの値は、サーバーの設定ファイル(`config.php` など、公開されない場所)に持ち、仕様書には書かない。 - 送信者本人のアドレスは、`From` にしない(迷惑メール判定・なりすまし防止のため)。送信者本人のメール(`employees` から、サーバー側で解決)は、`Reply-To` に設定する。 - 本文の末尾に、サーバー側で、送信者の氏名とSPS_IDを付ける(受け取った人が、誰からの連絡か分かるように)。画面で入力された本文には含めない。 - **成功時**: `{ "success": true, "message": "送信しました" }` - **失敗時の応答**: 失敗の内部の詳細(サーバーのエラー、メールサーバーの応答、アドレス)は、画面に返さない。ログにだけ残す。 | 状況 | HTTP | `message` | |---|---|---| | 未ログイン | 401 | 未ログイン | | 権限がない(`employee_directory_view` なし) | 403 | 送信する権限がありません | | 必須項目が足りない、件名・本文が空 | 400 | 件名と本文を入力してください | | 件名に改行が含まれる、文字数超過 | 400 | 件名または本文の内容が正しくありません | | 宛先の従事者がいない | 404 | 宛先の従事者が見つかりません | | 宛先のメールアドレスが未登録 | 400 | 宛先のメールアドレスが登録されていません | | 短時間に大量に送信した(制限の値は未決) | 429 | 送信回数が多すぎます。しばらくしてからお試しください | | メールの送信に失敗 | 500 | 送信できませんでした。時間をおいて、もう一度お試しください | - **画面側の表示**: 失敗したら、メールタブの中に、`message` をインラインで表示する。**入力した件名・本文は消さない**(再送できるように)。送信中は、送信ボタンを無効にする(二重送信の防止)。 ## 4. 動作仕様 - 検索バーで名指し検索を行い、一致した従事者を表示する。 - 行をクリックすると、詳細が表示される。 - 詳細内で「メール」タブを選択し、件名・本文を入力して送信ボタンを押す。 - 成功時はインラインで「送信しました」と表示する。 ## 5. 監査ログ - メール送信の記録を、監査ログ(`00_06_audit_log.md`)の記録対象とする。 - 記録項目: 日時、送信者(SPS_ID)、宛先ID(`to_sps_id`)、成否(成功/失敗)。失敗は、失敗の種別も記録する。 - 本文は記録しない(案)。 ## 6. 拡張予定(メモ) - 将来的に「現在の居場所(現場名)」「本日の予定」等を表示し、近くにいる従事者へその場で依頼できる機能を追加する可能性がある。その際はAPIレスポンスに項目を追加する。 ## 7. 制約 - localStorage / sessionStorage 使用禁止。 - confirm() / alert() 使用禁止。 - データの表示は、`textContent` または無害化関数を使う。`innerHTML` に、データをそのまま入れてはならない(XSS対策)。 ## 8. 改訂履歴 | 日付 | 版 | 担当 | 内容 | |------|----|------|------| | 2026-10-26 | 1.0 | Deepseek(5代目) | 初版作成 | | 2026-10-26 | 1.1 | Deepseek(5代目) | 担当者選択時の詳細表示、およびその場でのメール送信機能を仕様に追加。将来的な「居場所・予定」拡張のメモを追記。 | | 2026-10-27 | 1.2 | Deepseek(5代目) | 連絡先を含む一覧を、担当者一覧専用のAPI(`load_directory_list.php`)に分離。`send_mail.php` の仕様(`employee_directory_view`、`to_sps_id`からの宛先解決、ヘッダーインジェクション対策)を明記。メール送信の監査ログ記録を追加。XSS対策(`innerHTML`禁止)を追加。 | | 2026-10-29 | 1.3 | 全体管理者(14代目) | 3.2節に、送信元アドレス(固定の会社アドレスを `From`、送信者本人を `Reply-To`。案)、入力の制限(案)、失敗時の応答(HTTPステータスとメッセージの一覧)、画面側の表示(入力を消さない、二重送信防止)を追記。5節に、成否を記録に加えた。例のIDを `SPS01-99999` に差し替え | | 2026-10-29 | 1.4 | 全体管理者(14代目) | DB前提の確認。内容の変更なし |