コンテンツにスキップ

職員ポータル(入口・個人ダッシュボード)機能仕様

  • 文書バージョン: 0.2(実装反映)
  • 作成日: 2026-08-02
  • 現況再確認: 2026-09-13(routers/staff_portal.py、staff_portal_service.py、関連テストを照合)
  • ステータス: MVP実装済み
  • 対象: open-hoikuict
  • 想定利用者: 保育施設の職員、管理者

1. 目的

職員が勤務開始時や業務の合間に開く「入口」を用意し、その日の予定、担当クラスの出席状況、要確認事項、日常業務への導線を一画面に集約する。

同じ入口を未ログインでも表示できるようにし、未ログイン時は現在時刻、「ログインしてください」という案内、職員ログインボタンだけを表示する。ログイン後は職員本人と担当クラスに合わせた個人ポータルへ切り替える。

本画面は既存機能を置き換えるものではなく、要点を確認して既存の詳細画面へ移動するためのダッシュボードとする。

2. この仕様での決定事項

  1. 入口の標準URLは / とする。
  2. / は職員セッションの有無で表示内容を切り替える。
  3. 未ログイン時は、現在時刻、「ログインしてください」、職員ログインボタンだけを表示する。
  4. 園児名、出欠、健康情報、職員名、予定、お知らせ、職員限定連絡等の業務情報は未ログイン画面に一切表示しない。
  5. ログイン後は、今日の予定、担当クラスの出席状況、要確認事項、よく使う機能を表示する。
  6. ポータル上では原則として閲覧と画面遷移だけを行い、出欠打刻、予定編集、回答入力等は既存画面で行う。
  7. 職員と担当クラスはStaffClassroomAssignmentで正式に紐付ける。
  8. 初期表示はサーバーサイドレンダリングとし、自動更新やカードの並べ替えは初期対象外とする。

3. 用語

用語 定義
入口 ログイン状態に応じてログイン案内または職員ホームを表示する /
ログイン案内 未ログイン時に現在時刻、ログイン案内、ログインボタンだけを表示する画面
職員ホーム ログイン中の職員本人向けに内容を絞ったポータル画面
担当クラス 基準日に有効な職員クラス割当があるクラス
今日 職員のタイムゾーンにおける当日0:00以上、翌日0:00未満
在園中 当日の登園打刻または出席確認があり、降園打刻・欠席確認がない状態
要確認 出欠不整合、状態不明、未回答アンケートなど職員の確認が必要な状態

4. 対象範囲

4.1 初期実装(MVP)

機能 内容
ログイン案内 現在時刻、「ログインしてください」、職員ログインボタン
ログイン状態切替 同じ入口でログイン案内と職員ホームを切り替える
職員ホームヘッダー 職員名、ロール、日付、更新時刻、ログアウト導線
今日の予定 本人が閲覧できる当日予定を表示する
担当クラス出席 担当クラス別の在籍・登園・在園中・降園・欠席・要確認件数を表示する
要確認園児 トップは件数のみ。/staff/attention に権限内の園児別明細を全件表示する
要確認事項 未回答アンケート等の件数と詳細画面への導線を表示する
クイックアクセス 出欠、日次連絡、カレンダー、職員ルーム等への導線
空・障害状態 データなし、担当未設定、一部取得失敗をカード単位で表示する
レスポンシブ対応 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 相当で取得する。
  • アーカイブ済みカレンダーを除外する。カレンダー画面で表示OFFにした接続カレンダーも、閲覧権限があれば含める。
  • 今日の範囲と重なる単発、終日、日またぎ、繰り返し予定を取得する。
  • 確定予定(confirmed)だけを表示し、仮予定・削除済み・キャンセル済みの予定を除外する。
  • 非公開予定は既存の閲覧権限を適用し、権限がなければ「予定あり」のみ表示する。

表示内容:

  • 開始時刻。終日予定は「終日」
  • 予定タイトル
  • カレンダー名と色
  • 進行中・次の予定・終了の状態
  • 権限がある場合のみ場所

進行中、今後、終了済みの順とし、各区分内は終日予定、開始時刻、タイトルの順とする。件数上限を設けず全件表示する。「カレンダーへ」で既存の当日表示を開く。

7.5 担当クラスの出席カード

基準日に有効な担当クラスを1クラス1カードで表示する。担当表示は3クラスまでとし、超過時は「ほかNクラス」を表示する。全クラス表示は全件を対象にする。一般職員の初期表示は担当、担当未設定の管理者は全クラスを初期表示する。

指標 判定
在籍 基準日に在籍対象となる園児
登園 当日の AttendanceRecord.check_in_at または出席確認がある。一人一件で集計
在園中 登園打刻または出席確認があり、降園時刻・欠席確認がない
降園 当日の登園・降園時刻が両方ある
欠席 AttendanceVerification.status が私用休みまたは病気休み
未登園 登園時刻・出席確認・欠席確認がいずれもない
要確認 AttendanceAlarmState.is_active = true、または出欠確認が unknown
アラーム AttendanceAlarmState.is_active = true の園児数。理由の延べ件数ではない
出席確認済み・打刻未入力 出席確認があるが、実際の登園時刻が未登録の園児数

クラスカードは出欠確認へ遷移する。出席確認で登園時刻を自動生成しない。2026年9月17日の変更内容は追加仕様を参照。

表示ルール:

  • 数字だけでなく項目名を常に表示し、色だけで状態を区別しない。
  • 「要確認」が1件以上の場合はカード上部に警告を表示する。
  • ポータルトップでは園児別の明細を表示せず、クラス別の人数と要確認件数だけを表示する。
  • 園児氏名はログイン後かつ当該クラスを閲覧できる職員にのみ返す。
  • 「出席一覧を開く」で日付・クラスを指定した既存出席一覧へ遷移する。
  • ポータルを開いたことを出席確認済みとして記録しない。
  • 担当クラスがない場合は「担当クラスが設定されていません」と表示する。
  • ログイン中の職員はロールにかかわらず scope=all で全クラスの人数サマリーへ切り替えられる。これは要確認ページの園児別明細や編集権限を広げる操作ではない。

7.6 要確認カード・職員別要確認ページ

MVPでは次を表示する。

  1. 担当クラスの出欠アラーム・状態不明
  2. 本人が対象となる公開中かつ未回答の職員アンケート
  3. 保育計画の確認結果は帳票通知、管理者への提出は承認待ち欄に分けて表示する

トップの要確認件数は、表示中のクラスの出欠要確認件数と本人の未回答アンケート件数の合計。明細は /staff/attention に分離する。このページでは担当クラスの出欠アラーム・状態不明と、本人が対象となる未回答アンケートを全件表示する。一般職員は scope=all を付けても担当クラスの明細に限定し、管理者だけが全クラスの明細を選べる。そのため、一般職員がトップを全クラス表示にした場合、件数と明細の対象範囲は同一ではない。

管理者の承認待ち欄には、保育計画、お知らせ、園児情報変更、保護者の初回登録、文書の確認依頼を申請日時の新しい順に表示する。保護者初回登録はローカルパスワード認証時に取得する。端末監視の無応答警告も管理者ホームに表示する。9月11日の機能追加を併せて参照する。

ポータル表示だけで、アンケート回答済み、職員連絡既読、出欠確認済みにはしない。

重要連絡の個人別既読管理は現行モデルにないため、MVPで既読件数まで表示する場合は別途 staff_message_reads を追加する。追加しない場合は「最新の重要連絡」として表示し、未読とは表現しない。

7.7 クイックアクセス

初期表示は次の順とする。

表示名 遷移先 補足
要確認一覧 /staff/attention ログイン中職員に紐づく要確認を全件表示
担当クラス出席 /attendance?date=今日&classroom_id=担当 担当が複数なら選択メニュー
出欠確認 /attendance-checks/ 不整合確認
日次連絡 /daily-contacts 保護者連絡確認
カレンダー /calendar 予定確認・編集
職員ルーム /staff-rooms/ 業務連絡
指導計画 /plans/ 計画・文書
文書の確認依頼 /document-reviews/ 職員サイドバーから提出・判定結果へ進む
お知らせ管理 /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 閲覧可能な接続カレンダー。表示OFF設定はホームの除外条件にしない
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 とする。
  • 要確認ページの全クラス明細は管理者に限定する。ホームの全クラス人数表示は一般職員にも許可し、遷移先の各業務画面ではその画面の認可を再評価する。
  • 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 職員ホーム

  • 職員名、ロール、日付、担当クラスが表示される。
  • 本人が閲覧可能な接続カレンダーの当日確定予定を、カレンダー画面の表示ON/OFFにかかわらず全件表示する。
  • 非公開予定は既存権限どおりマスクされる。
  • 担当クラスごとの出席指標が当日データから正しく集計される。
  • 一般職員が要確認ページに scope=all を付けても、担当外クラスの明細へ範囲を広げない。
  • 一般職員もホームを全クラスの人数表示へ切り替えられる。要確認ページの全クラス明細は管理者だけに許可する。
  • 担当未設定、予定なし、要確認なしの空状態が区別される。
  • ポータル閲覧だけで既読、回答済み、確認済み、出欠状態が更新されない。

13.4 回帰

  • 既存の園児、出欠、カレンダー、職員ルーム、アンケート画面へ直接アクセスできる。
  • 保護者ポータルのログインとナビゲーションに影響しない。
  • view_only、can_edit、admin の既存権限が維持される。
  • PC、タブレット、スマートフォンで主要情報と導線が利用できる。

14. テスト観点

分類 主なケース
認証 未ログイン、有効職員、無効職員、職員レコードなし、ログアウト
ログイン案内 時刻形式、タイムゾーン、1分更新、JavaScript無効、ログイン導線
情報漏えい 未ログインHTML、テンプレートコンテキスト、ログ、キャッシュ、エラー、URL直打ち
担当割当 主担当、補助、臨時、複数、期間前後、重複、未設定
出席 未登園、在園中、降園済み、欠席、状態不明、アラーム、記録なし
予定 個人、共有、非表示、アーカイブ、非公開、終日、日またぎ、繰り返し、例外
権限 閲覧のみ、編集可、管理者、担当外クラスID、無効ユーザー
表示 0件、上限超過、一部取得失敗、長い名称、複数クラス、320px幅
回帰 既存各画面、保護者ポータル、CSRF、安全なリダイレクト

15. 実装順序

  1. / の任意認証と、現在時刻・ログイン案内だけの未ログイン画面を実装する。
  2. staff_classroom_assignments と管理画面を追加する。
  3. ログイン後の職員ホーム、担当クラス出席サマリーを実装する。
  4. 今日の予定、要確認、クイックアクセスを統合する。
  5. サイドバー・ログイン後遷移・ログアウト後遷移を変更する。
  6. 認証境界、担当外アクセス、未ログイン時の情報漏えいに関する自動テストを追加する。
  7. レスポンシブ、アクセシビリティ、空状態、一部障害を手動確認する。

16. 実装前に運用側と確認する項目

以下は既定案を置いているため実装開始は可能だが、運用決定により表示内容が変わる。

  1. 担当クラスは年度単位か、期間指定や日替わり応援まで管理するか。
  2. 一人が複数クラスを担当する場合の主担当表示順。
  3. 「未登園」を要確認にする時刻。初期案では既存出欠アラームの判定に従う。
  4. 全職員に許可している全クラス人数サマリーと、管理者限定の要確認明細の使い分け。
  5. よく使う機能の初期並び順と施設固有リンクの要否。

17. 将来拡張

  • 勤務シフト、打刻、休暇残数
  • 職員連絡の個人別未読・確認済み管理
  • ポータルカードの並べ替え・表示設定
  • クラス単位・役割単位の業務連絡
  • HTMX等によるカード単位の更新
  • PWA・プッシュ通知
  • 施設・法人をまたぐ複数拠点対応
  • よく使う機能の利用頻度に応じた提案