職員ポータル(入口・個人ダッシュボード)機能仕様
- 文書バージョン: 0.2(実装反映)
- 作成日: 2026-08-02
- 現況再確認: 2026-08-11
- ステータス: MVP実装済み
- 対象: open-hoikuict
- 想定利用者: 保育施設の職員、管理者
1. 目的
職員が勤務開始時や業務の合間に開く「入口」を用意し、その日の予定、担当クラスの出席状況、要確認事項、日常業務への導線を一画面に集約する。
同じ入口を未ログインでも表示できるようにし、未ログイン時は現在時刻、「ログインしてください」という案内、職員ログインボタンだけを表示する。ログイン後は職員本人と担当クラスに合わせた個人ポータルへ切り替える。
本画面は既存機能を置き換えるものではなく、要点を確認して既存の詳細画面へ移動するためのダッシュボードとする。
2. この仕様での決定事項
- 入口の標準URLは
/とする。 /は職員セッションの有無で表示内容を切り替える。- 未ログイン時は、現在時刻、「ログインしてください」、職員ログインボタンだけを表示する。
- 園児名、出欠、健康情報、職員名、予定、お知らせ、職員限定連絡等の業務情報は未ログイン画面に一切表示しない。
- ログイン後は、今日の予定、担当クラスの出席状況、要確認事項、よく使う機能を表示する。
- ポータル上では原則として閲覧と画面遷移だけを行い、出欠打刻、予定編集、回答入力等は既存画面で行う。
- 職員と担当クラスは
StaffClassroomAssignmentで正式に紐付ける。 - 初期表示はサーバーサイドレンダリングとし、自動更新やカードの並べ替えは初期対象外とする。
3. 用語
| 用語 | 定義 |
|---|---|
| 入口 | ログイン状態に応じてログイン案内または職員ホームを表示する / |
| ログイン案内 | 未ログイン時に現在時刻、ログイン案内、ログインボタンだけを表示する画面 |
| 職員ホーム | ログイン中の職員本人向けに内容を絞ったポータル画面 |
| 担当クラス | 基準日に有効な職員クラス割当があるクラス |
| 今日 | 職員のタイムゾーンにおける当日0:00以上、翌日0:00未満 |
| 在園中 | 当日の登園時刻があり、降園時刻がない状態 |
| 要確認 | 出欠不整合、状態不明、未回答アンケートなど職員の確認が必要な状態 |
4. 対象範囲
4.1 初期実装(MVP)
| 機能 | 内容 |
|---|---|
| ログイン案内 | 現在時刻、「ログインしてください」、職員ログインボタン |
| ログイン状態切替 | 同じ入口でログイン案内と職員ホームを切り替える |
| 職員ホームヘッダー | 職員名、ロール、日付、更新時刻、ログアウト導線 |
| 今日の予定 | 本人が閲覧できる当日予定を表示する |
| 担当クラス出席 | 担当クラス別の在籍・登園・在園中・降園・欠席・要確認件数を表示する |
| 要確認園児 | 出欠アラームまたは状態不明の園児を最大5名表示する |
| 要確認事項 | 未回答アンケート等の件数と詳細画面への導線を表示する |
| クイックアクセス | 出欠、日次連絡、カレンダー、職員ルーム等への導線 |
| 空・障害状態 | データなし、担当未設定、一部取得失敗をカード単位で表示する |
| レスポンシブ対応 | PC、タブレット、スマートフォンで利用できる |
4.2 初期実装の対象外
- 勤務シフト、打刻、休暇、勤怠実績の表示
- ポータル上での登園・降園打刻や出欠確定
- カードの並べ替え、非表示、利用者ごとのカスタマイズ
- WebSocket等によるリアルタイム自動更新
- メール、Slack、Teams、プッシュ通知との連携
- 保護者ポータルの変更
- 園児の健康情報・アレルギーのポータル表示
- 未ログイン利用者へのお知らせ、予定、園情報等の公開
5. 利用者と権限
| 表示・操作 | 未ログイン | 閲覧のみ | 編集可 | 管理者 |
|---|---|---|---|---|
| ログイン案内 | 可 | 可 | 可 | 可 |
| 職員ホーム | 不可 | 可 | 可 | 可 |
| 本人の予定 | 不可 | 既存権限内 | 既存権限内 | 既存権限内 |
| 担当クラス出席サマリー | 不可 | 可 | 可 | 可 |
| 出席詳細画面への遷移 | 不可 | 可 | 可 | 可 |
| ポータルからの出欠更新 | 不可 | 不可 | 不可 | 不可 |
| 全クラス切替 | 不可 | 不可 | 不可 | 可 |
| 担当クラス割当管理 | 不可 | 不可 | 不可 | 可 |
権限判定は画面上の非表示だけに依存せず、各ルーター・サービス層で実施する。
6. URL・画面遷移
| 用途 | メソッド | URL | 未ログイン時 |
|---|---|---|---|
| 統合入口 | GET | / |
ログイン案内を表示 |
| 職員ホーム別名 | GET | /staff/portal |
/staff/login?redirect=/staff/portal へ遷移 |
| 職員ログイン | GET/POST | /staff/login |
ログイン画面を表示・認証 |
| 職員ログアウト | POST | /staff/logout |
セッション破棄後 / へ遷移 |
| 出席詳細 | GET | /attendance?date=YYYY-MM-DD&classroom_id={id} |
ログインへ遷移 |
| 当日カレンダー | GET | /calendar?mode=day&date=YYYY-MM-DD |
ログインへ遷移 |
| 担当クラス管理 | GET/POST | /staff/users/{user_id}/classrooms |
ログインへ遷移、管理者のみ |
ログイン成功後の標準遷移先は / とする。ただし安全な内部URLが redirect で指定された場合はそのURLを優先する。外部URLへのリダイレクトは許可しない。
既存のブックマークや詳細画面への直接アクセスは維持する。職員サイドバーの先頭に「ホーム」を追加し、職員画面のロゴリンクも / とする。
7. 画面仕様
7.1 未ログイン時のログイン案内
┌──────────────────────────────────────────┐
│ open-hoikuict │
│ │
│ 08:31 │
│ ログインしてください │
│ [ログインする] │
│ │
└──────────────────────────────────────────┘
表示項目:
- 現在時刻(24時間表記の
HH:mm) - 「ログインしてください」という固定文言
- 職員ログインボタン
- 画面共通要素としてのサービスロゴまたはサービス名
現在時刻は施設既定タイムゾーンで表示し、未設定時は Asia/Tokyo とする。初回HTMLはサーバー時刻で描画し、JavaScriptが利用可能な場合は1分ごとに表示を更新する。秒は表示しない。JavaScriptが無効でも初回表示時刻とログイン操作は利用できる。
ログイン案内では次を表示してはならない。
- 園児・保護者・職員の氏名、写真、連絡先
- 出席・欠席・登降園の人数および個別状態
- 担当クラス、職員配置、勤務状態
- 予定、お知らせ、カレンダー情報
- 職員ルーム、議事録、アンケート、日次連絡の内容・件数
- 管理画面や詳細画面への推測可能なID付きリンク
7.2 ログイン後の職員ホーム
┌────────────────────────────────────────────────────────────┐
│ おはようございます、山田 花子さん 2026年8月2日(日) │
│ 担当: ひよこ組 最終更新 08:31 │
│ [要確認 3件] [在園中 12名] [次の予定 10:00 職員会議] │
├───────────────────────────────┬────────────────────────────┤
│ 今日の予定 │ 担当クラスの出席 │
│ 09:00 朝礼 │ ひよこ組 │
│ 10:00 職員会議 │ 在籍18 登園15 在園12 │
│ 終日 夏まつり準備 │ 降園3 欠席2 要確認1 │
│ [カレンダーへ] │ [出席一覧を開く] │
├───────────────────────────────┴────────────────────────────┤
│ 要確認 │
│ [出欠] 佐藤 ○○さん:出欠状態を確認してください │
│ [アンケート] 研修希望調査:期限まで2日 │
├────────────────────────────────────────────────────────────┤
│ よく使う機能 │
│ [出欠一覧] [日次連絡] [カレンダー] [職員ルーム] [指導計画]│
└────────────────────────────────────────────────────────────┘
7.3 ヘッダー・サマリー
表示項目:
- 時刻に応じた挨拶と職員表示名
- 職員ロール
- 有効な担当クラス名。複数ある場合は読点区切り、3件超は「ほかNクラス」
- 職員タイムゾーンでの日付と曜日
- 最終更新時刻
- 要確認件数
- 担当クラス全体の在園中人数
- 現在以降で最も近い予定
要確認件数は同一対象を重複計上せず、99件を超える場合は 99+ と表示する。
7.4 今日の予定カード
表示対象:
- 本人が参照可能なカレンダーを既存の
list_calendar_contexts相当で取得する。 - アーカイブ済みカレンダーと本人が非表示にしたカレンダーを除外する。
- 今日の範囲と重なる単発、終日、日またぎ、繰り返し予定を取得する。
- 削除済み・キャンセル済みの予定を除外する。
- 非公開予定は既存の閲覧権限を適用し、権限がなければ「予定あり」のみ表示する。
表示内容:
- 開始時刻。終日予定は「終日」
- 予定タイトル
- カレンダー名と色
- 進行中・次の予定・終了の状態
- 権限がある場合のみ場所
進行中、今後、終了済みの順とし、各区分内は開始時刻順とする。最大6件を表示し、超過時は「ほかN件」とする。「カレンダーへ」で既存の当日表示を開く。
7.5 担当クラスの出席カード
基準日に有効な担当クラスを1クラス1カードで表示する。初期表示は3クラスまでとし、超過時は「ほかNクラス」を表示する。
| 指標 | 判定 |
|---|---|
| 在籍 | 基準日に在籍対象となる園児 |
| 登園 | 当日の AttendanceRecord.check_in_at がある |
| 在園中 | 登園時刻があり、降園時刻がない |
| 降園 | 当日の登園・降園時刻が両方ある |
| 欠席 | AttendanceVerification.status が私用休みまたは病気休み |
| 未登園 | 登園時刻がなく、欠席確定でもない |
| 要確認 | AttendanceAlarmState.is_active = true、または出欠確認が unknown |
表示ルール:
- 数字だけでなく項目名を常に表示し、色だけで状態を区別しない。
- 「要確認」が1件以上の場合はカード上部に警告を表示する。
- ポータルトップでは園児別の明細を表示せず、クラス別の人数と要確認件数だけを表示する。
- 園児氏名はログイン後かつ当該クラスを閲覧できる職員にのみ返す。
- 「出席一覧を開く」で日付・クラスを指定した既存出席一覧へ遷移する。
- ポータルを開いたことを出席確認済みとして記録しない。
- 担当クラスがない場合は「担当クラスが設定されていません」と表示する。
- 管理者は「全クラス」を選択できる。通常職員は割り当てられたクラス以外へ切り替えられない。
7.6 要確認カード・職員別要確認ページ
MVPでは次を表示する。
- 担当クラスの出欠アラーム・状態不明
- 本人が対象となる公開中かつ未回答の職員アンケート
- 取得できる場合は、既存職員ルームの重要連絡
ポータルトップは職員本人の要確認総件数だけを表示し、明細は /staff/attention に分離する。職員別要確認ページでは、担当クラスの出欠アラーム・状態不明と、本人が対象となる未回答アンケートを全件表示する。並び順は、出欠アラーム、期限24時間以内のアンケート、その他の未回答アンケート、重要連絡とする。各項目には種別、要約、期限または発生時刻、詳細画面へのリンクを表示する。
ポータル表示だけで、アンケート回答済み、職員連絡既読、出欠確認済みにはしない。
重要連絡の個人別既読管理は現行モデルにないため、MVPで既読件数まで表示する場合は別途 staff_message_reads を追加する。追加しない場合は「最新の重要連絡」として表示し、未読とは表現しない。
7.7 クイックアクセス
初期表示は次の順とする。
| 表示名 | 遷移先 | 補足 |
|---|---|---|
| 要確認一覧 | /staff/attention |
ログイン中職員に紐づく要確認を全件表示 |
| 担当クラス出席 | /attendance?date=今日&classroom_id=担当 |
担当が複数なら選択メニュー |
| 出欠確認 | /attendance-checks/ |
不整合確認 |
| 日次連絡 | /daily-contacts |
保護者連絡確認 |
| カレンダー | /calendar |
予定確認・編集 |
| 職員ルーム | /staff-rooms/ |
業務連絡 |
| 指導計画 | /plans/ |
計画・文書 |
| お知らせ管理 | /notices |
権限がある場合のみ |
利用権限のない機能はリンクを表示しない。初期実装では職員ごとの並べ替え設定を持たない。
7.8 連絡タイムライン
ポータルトップに職員ルームの親投稿を新しい順で最大5件表示する。投稿者、投稿日時、ルーム名、本文の概要を表示し、選択すると該当スレッドを開く。返信はトップへ単独表示せず、スレッド内で確認する。「すべて見る」から職員ルームの全体タイムラインへ遷移する。
7.9 レスポンシブ配置
| 画面幅 | 配置 |
|---|---|
| 1024px以上 | 予定と出席を2列、要確認とクイックアクセスを全幅 |
| 768px以上1024px未満 | 予定と出席を同幅2列、必要に応じ内部折返し |
| 768px未満 | ヘッダー、出席、要確認、予定、クイックアクセスの1列 |
スマートフォンでは現場で優先度の高い出席と要確認を予定より先に表示する。横スクロールは発生させない。タップ対象は原則44px以上とする。
8. データモデル
8.1 既存モデルの再利用
| モデル | 用途 |
|---|---|
User |
ログイン職員、表示名、ロール、タイムゾーン |
Classroom / Child |
担当クラスと在籍園児 |
AttendanceRecord |
登園・降園状態 |
AttendanceVerification |
出席・欠席・不明の確認状態 |
AttendanceAlarmState |
出欠不整合・要確認状態 |
Calendar、CalendarMember、CalendarUserPreference |
閲覧可能・表示対象カレンダー |
Event、RecurrenceRule、EventOverride |
当日予定 |
Survey、SurveyTarget、SurveyAnswer |
職員アンケートと回答状態 |
ポータル専用に出欠や予定を複製せず、既存モデルを正とする。
8.2 staff_classroom_assignments
| カラム | 型 | 内容 |
|---|---|---|
id |
integer | 主キー |
staff_user_id |
uuid, FK users.id |
対象職員 |
classroom_id |
integer, FK classrooms.id |
担当クラス |
assignment_role |
string | primary / support / temporary |
starts_on |
date | 担当開始日 |
ends_on |
date, nullable | 担当終了日。終了日を含む |
is_primary |
boolean | ポータルで最初に表示する主担当か |
display_order |
integer | 複数担当時の表示順 |
created_at |
datetime | 作成日時 |
updated_at |
datetime | 更新日時 |
制約・運用:
starts_on <= ends_onとする。ends_on = nullは期限なし。- 同一職員・同一クラスで有効期間が重なる割当はアプリケーション層で拒否する。
- 1職員に有効な
is_primary = trueが複数ある場合は、display_order、クラス表示順の順で先頭を採用し、管理画面に警告する。 - 削除ではなく終了日設定を基本とし、年度変更履歴を保持する。
staff_user_id、classroom_id、starts_on、ends_onに検索用インデックスを設定する。
9. データ取得・表示ルール
9.1 基準日時
- DB日時は既存方針どおりUTCで保存する。
- 日付境界と画面表示は職員の
User.timezoneを使用する。 - 未ログイン時の現在時刻は施設既定タイムゾーンを使用し、未設定時は
Asia/Tokyoとする。 - 1リクエスト内では同じ
nowを使用する。 - 園児の在籍判定は
enrollment_date <= 基準日かつ、退園日がないまたは基準日 <= withdrawal_dateとする。
9.2 更新とキャッシュ
- 初回表示はサーバーサイドレンダリングとする。
- 「更新」ボタンでページ全体を再取得する。
- 職員ホームのレスポンスは
Cache-Control: private, no-storeとする。 - ログイン案内は現在時刻を表示するため
Cache-Control: no-storeとし、ログインCookieの有無でレスポンスを混在させない。 - 初期実装では自動更新を必須にしない。
9.3 一部取得失敗
予定、出席、要確認のいずれか一つの取得失敗で職員ホーム全体を500エラーにしない。失敗したカードだけに「情報を取得できませんでした。再読み込みしてください」と表示する。
サーバーログには相関ID、職員ID、失敗したカード種別、例外を記録する。園児名、予定本文、アンケート回答本文をログへ出力しない。
10. サーバー構成
10.1 ルーター
routers/staff_portal.pyが次の責務を持つ。GET /staff/portalは同じ職員ホームのログイン必須別名、GET /staff/attentionは要確認事項の全件画面である。
GET /
├─ 職員セッションを任意解決
├─ 未ログイン: 現在時刻とログイン案内だけを構築
└─ ログイン済み:
├─ 職員レコードと担当クラスを解決
├─ 今日の予定を取得
├─ 担当クラス出席サマリーを取得
├─ 要確認事項を取得
└─ 権限に応じたクイックリンクを構築
未ログイン時は職員ホーム用サービスを呼び出さず、業務データをテンプレートコンテキストへ含めない。
10.2 サービス
staff_portal_service.py- 担当クラス解決
- 出席サマリー・要確認園児の集計
- 予定・アンケート等の表示モデル統合 サービスはSQLModelの行をテンプレートへ直接渡さず、表示に必要な値だけを持つDTOを返す。
10.3 テンプレート
templates/portal/index.html
templates/portal/login_prompt.html
templates/portal/attention.html
base.html は未ログインのログイン案内で職員サイドバーを出さない。ログイン済み職員ホームでは既存サイドバーを利用する。
11. セキュリティ・プライバシー
- 未ログイン時は
get_optional_current_staff_userを使い、認証必須データの取得処理自体を呼ばない。 - ログイン案内のHTML、JSON、メタタグ、構造化データ、エラーメッセージには、現在時刻と固定のログイン案内以外の業務情報を含めない。
- 園児名・出欠のレスポンスは
Cache-Control: private, no-storeとする。 - 通常職員がURLの
classroom_idを書き換えても、未担当クラスの個別情報を取得できないようサーバー側で検証する。 - 管理者の全クラス切替もログインと権限を再検証する。
- POSTは既存CSRF保護を適用する。
- ログイン後に戻るボタンで個人情報が見え続けるリスクを下げるため、認証画面と職員ホームをブラウザ共有キャッシュさせない。
- 担当クラス割当変更は監査対象とする。
- 本番認証方式は既存
StaffAuthBackendに従い、この仕様ではパスワード認証方式を新設しない。
12. 非機能要件
12.1 性能
- 目標: 通常データ量でサーバー応答1秒以内、初期表示2秒以内。
- カードごとのN+1クエリを避ける。
- 出席集計は担当クラスと当日でDB側絞り込みを行う。
- 初期表示件数を超える明細は取得せず、全件数だけを別集計する。
12.2 アクセシビリティ
- 見出し階層を保ち、カード名を見出しとして読み上げられるようにする。
- 状態を色だけで伝えず、文字ラベルとアイコンを併用する。
- キーボードだけで全リンク・ボタンを操作できる。
- フォーカス表示を消さない。
- 日付と時刻は読み上げ時に意味が通るテキストを持たせる。
12.3 対応環境
- 現行プロジェクトがサポートする最新のChrome、Edge、Safariを対象とする。
- 320px幅から横スクロールなしで利用できる。
- JavaScriptが失敗しても主要情報と画面遷移は利用できる。
13. 受入条件
13.1 ログイン案内
- 未ログインで
/を開くと現在時刻、「ログインしてください」、職員ログインボタンが表示される。 - 未ログインでもログイン画面へ強制遷移しない。
- 現在時刻は施設既定タイムゾーンの
HH:mm形式で表示される。 - JavaScript利用時は時刻が1分ごとに更新される。
- 園児、保護者、職員、出欠、予定、お知らせ等の業務情報がHTMLにもレスポンスデータにも含まれない。
13.2 ログインと遷移
- ログイン成功後は標準で
/の職員ホームが表示される。 - ログアウト後は
/のログイン案内が表示される。 - 安全な内部リダイレクトは維持され、外部URLには遷移しない。
- 無効職員または職員レコード不在では個人情報を表示しない。
13.3 職員ホーム
- 職員名、ロール、日付、担当クラスが表示される。
- 本人が閲覧可能で表示中の当日予定だけが表示される。
- 非公開予定は既存権限どおりマスクされる。
- 担当クラスごとの出席指標が当日データから正しく集計される。
- 担当外の通常職員がクラスIDを変更しても個別情報を取得できない。
- 管理者は全クラス表示へ切り替えられる。
- 担当未設定、予定なし、要確認なしの空状態が区別される。
- ポータル閲覧だけで既読、回答済み、確認済み、出欠状態が更新されない。
13.4 回帰
- 既存の園児、出欠、カレンダー、職員ルーム、アンケート画面へ直接アクセスできる。
- 保護者ポータルのログインとナビゲーションに影響しない。
-
view_only、can_edit、adminの既存権限が維持される。 - PC、タブレット、スマートフォンで主要情報と導線が利用できる。
14. テスト観点
| 分類 | 主なケース |
|---|---|
| 認証 | 未ログイン、有効職員、無効職員、職員レコードなし、ログアウト |
| ログイン案内 | 時刻形式、タイムゾーン、1分更新、JavaScript無効、ログイン導線 |
| 情報漏えい | 未ログインHTML、テンプレートコンテキスト、ログ、キャッシュ、エラー、URL直打ち |
| 担当割当 | 主担当、補助、臨時、複数、期間前後、重複、未設定 |
| 出席 | 未登園、在園中、降園済み、欠席、状態不明、アラーム、記録なし |
| 予定 | 個人、共有、非表示、アーカイブ、非公開、終日、日またぎ、繰り返し、例外 |
| 権限 | 閲覧のみ、編集可、管理者、担当外クラスID、無効ユーザー |
| 表示 | 0件、上限超過、一部取得失敗、長い名称、複数クラス、320px幅 |
| 回帰 | 既存各画面、保護者ポータル、CSRF、安全なリダイレクト |
15. 実装順序
/の任意認証と、現在時刻・ログイン案内だけの未ログイン画面を実装する。staff_classroom_assignmentsと管理画面を追加する。- ログイン後の職員ホーム、担当クラス出席サマリーを実装する。
- 今日の予定、要確認、クイックアクセスを統合する。
- サイドバー・ログイン後遷移・ログアウト後遷移を変更する。
- 認証境界、担当外アクセス、未ログイン時の情報漏えいに関する自動テストを追加する。
- レスポンシブ、アクセシビリティ、空状態、一部障害を手動確認する。
16. 実装前に運用側と確認する項目
以下は既定案を置いているため実装開始は可能だが、運用決定により表示内容が変わる。
- 担当クラスは年度単位か、期間指定や日替わり応援まで管理するか。
- 一人が複数クラスを担当する場合の主担当表示順。
- 「未登園」を要確認にする時刻。初期案では既存出欠アラームの判定に従う。
- 管理職以外で全クラスの出席サマリーを必要とするロールがあるか。
- よく使う機能の初期並び順と施設固有リンクの要否。
17. 将来拡張
- 勤務シフト、打刻、休暇残数
- 職員連絡の個人別未読・確認済み管理
- ポータルカードの並べ替え・表示設定
- クラス単位・役割単位の業務連絡
- HTMX等によるカード単位の更新
- PWA・プッシュ通知
- 施設・法人をまたぐ複数拠点対応
- よく使う機能の利用頻度に応じた提案