職員有給管理機能仕様
- 現況再確認: 2026-08-11
- 実装状況: 未実装(計画)
有給台帳、申請、承認、残日数、CSV、カレンダー連携のモデルとルートは現在のコードには存在しない。本書のURL・データモデルは実装案である。
目的
職員が自分の有給希望、承認状況、取得履歴、残日数を確認でき、園長・事務職員が全職員の有給残、希望状況、取得実績を管理できるようにする。
現行の Google フォームと Google カレンダーによる運用は、自由に希望日を入れられる点が使いやすい一方で、希望が集中した日の調整、残日数確認、取得履歴の確認が分散しやすい。open-hoikuict に取り込む場合は、申請、承認、カレンダー反映、残日数、取得履歴を一つの流れで扱えるようにする。
初期実装では、給与計算やシフト自動作成までは扱わず、「希望を受ける」「差し戻す」「承認する」「残日数を正しく見せる」「記録として出せる」ことに絞る。
基本方針
- 有給管理は任意機能として追加し、施設設定で有効・無効を切り替えられるようにする。
- 職員は自分の有給希望、承認状況、取得履歴、残日数だけを閲覧できる。
- 園長・事務職員など、有給管理権限を持つ職員だけが全職員の残日数、付与、取得、調整履歴を閲覧・編集できる。
- 希望が集中した日は、個別差し戻しだけでなく、対象日の希望者をまとめて差し戻せるようにする。
- 承認済みの有給は open-hoikuict のカレンダーへ反映する。
- Google フォーム・Google カレンダーからの完全な双方向同期は初期実装対象外とし、移行用の CSV 取り込みを優先する。
- 有給理由は任意入力とし、入力された場合も管理者以外には見せない。
- 残日数や取得履歴に関わる操作は監査ログに残す。
用語
| 用語 | 意味 |
|---|---|
| 基準日 | 施設で管理する有給付与サイクルの起算日 |
| 付与ロット | 基準日ごとに付与された有給日数のまとまり |
| 残日数 | 付与ロットから取得済み・承認済みの有給を差し引いた残り |
| 希望 | 職員が取得したい日を入力した状態 |
| 申請 | 希望を管理者確認の対象として提出した状態 |
| 承認 | 園長・事務職員が取得を認めた状態 |
| 差し戻し | 希望日を再提出してもらう状態 |
| 却下 | その希望を採用しない状態 |
| 取得実績 | 実際に有給として扱った記録 |
| 管理者調整 | 残日数や取得実績を管理者が補正する操作 |
対象範囲
初期実装対象
| 項目 | 方針 |
|---|---|
| 職員本人の有給画面 | 残日数、希望作成、承認状況、取得履歴を表示する |
| 管理者画面 | 全職員の残日数、希望一覧、月別カレンダー、取得履歴を表示する |
| 有給希望申請 | 1 日単位、半日単位を扱う。時間単位は初期設定では無効 |
| 差し戻し | 個別差し戻しと、同一日の希望者一括差し戻しに対応する |
| 承認・取消 | 管理者が承認、差し戻し、却下、承認取消を実行できる |
| 残日数計算 | 付与ロットごとに残日数を計算し、期限が近いものから消化する |
| 付与管理 | 管理者が基準日、付与日数、有効期限、メモを登録できる |
| カレンダー連携 | 承認済み有給を施設共有カレンダーまたは職員予定として反映する |
| CSV 入出力 | 既存運用からの移行、取得履歴出力、残日数一覧出力に対応する |
| 監査ログ | 付与、承認、差し戻し、取消、残日数調整を記録する |
初期実装対象外
| 項目 | 理由 |
|---|---|
| 給与計算連携 | 勤怠締め、給与規程、控除計算と責務が異なる |
| シフト自動最適化 | 配置基準や園独自ルールが複雑なため別機能にする |
| Google カレンダー双方向同期 | 認証、競合解決、削除同期の設計が必要 |
| Google フォーム直接連携 | まずは CSV 取り込みで移行できるようにする |
| 時間単位年休 | 施設ごとの運用差が大きいため将来拡張にする |
| 特別休暇、代休、欠勤 | 有給休暇とは別種別として扱う |
| 規程に基づく自動判定 | 現段階では仕様から外し、残日数と希望管理に集中する |
権限
既存の admin / can_edit / view_only だけでは有給情報の公開範囲を表しきれないため、有給管理専用の権限を追加する。
| 利用者 | 自分の残日数 | 自分の履歴 | 自分の申請 | 全職員の残日数 | 全職員の承認 | 付与・調整 | 設定 |
|---|---|---|---|---|---|---|---|
| 一般職員 | 可 | 可 | 可 | 不可 | 不可 | 不可 | 不可 |
| 閲覧専用職員 | 可 | 可 | 可 | 不可 | 不可 | 不可 | 不可 |
| 有給管理者 | 可 | 可 | 可 | 可 | 可 | 可 | 可 |
| システム管理者 | 可 | 可 | 可 | 可 | 可 | 可 | 可 |
有給管理者の判定は、初期実装では users.can_manage_paid_leave のような boolean を追加する。園長・事務職員にこの権限を付与する。既存の can_edit 職員に自動で全職員の有給閲覧権限を与えない。
画面仕様
職員向け「自分の有給」画面
パス案: /staff/paid-leaves/me
表示する内容:
- 現在の残日数
- 選択年度内の取得済み日数
- 期限が近い付与ロット
- 申請中、承認済み、差し戻し中の希望
- 過去の取得履歴
- 新規希望入力フォーム
希望入力フォーム:
| 項目 | 内容 |
|---|---|
| 取得日 | 単日または期間 |
| 取得単位 | 1 日、午前半休、午後半休 |
| メモ | 任意。管理者だけ閲覧可 |
| 連絡事項 | 任意。差し戻し時の補足に使う |
職員本人には、他職員の残日数、付与日数、理由、管理者メモを表示しない。
管理者向け「有給管理」画面
パス案: /paid-leaves/
表示する内容:
- 月別カレンダー
- 日別の希望人数、承認人数、差し戻し人数
- クラスまたは職種別の希望人数
- 未処理の申請一覧
- 残日数が少ない職員
- 残日数が多く、期限が近い職員
- 期限切れが近い付与ロット
主な操作:
- 申請の承認、差し戻し、却下
- 同一日の希望者をまとめて差し戻し
- 差し戻し理由テンプレートの選択
- 管理者メモの登録
- 職員別台帳の確認
- CSV 出力
職員別台帳画面
パス案: /paid-leaves/staff/{staff_user_id}
表示する内容:
- 職員基本情報
- 基準日、付与日数、有効期限
- 付与ロットごとの消化状況
- 取得履歴
- 承認済みの未来予定
- 管理者調整履歴
- 監査ログ
管理者は、付与追加、残日数調整、取得実績の手動追加、誤登録の取消ができる。
設定画面
パス案: /paid-leaves/settings
設定項目:
| 項目 | 初期値 | 内容 |
|---|---|---|
| 機能有効化 | 無効 | 有給管理機能を表示するか |
| 半日単位 | 有効 | 午前半休・午後半休を許可するか |
| 時間単位 | 無効 | 将来拡張。初期実装では UI 非表示でもよい |
| 申請締切 | なし | 何日前まで申請可能にするか |
| 残日数不足時の申請 | 警告して送信可 | 管理者承認時に最終確認する |
| カレンダー反映 | 承認時に反映 | 施設共有カレンダーまたは職員予定を選ぶ |
| 職員向けカレンダー表示 | 名前と休みのみ | 残日数、理由、管理者メモは表示しない |
| 差し戻し理由必須 | 必須 | 差し戻し時は理由を記録する |
申請・承認フロー
通常申請
- 職員が自分の有給画面から希望日を入力する。
- システムは重複、残日数、締切、申請単位を検証する。
- 問題があれば警告を表示する。ただし、残日数不足など一部の警告は管理者判断に残せる。
- 申請は
requestedになる。 - 管理者が確認し、
approved、needs_resubmission、rejectedのいずれかに更新する。 - 承認時にカレンダーへ予定を作成する。
- 取得日を過ぎた承認済み申請は、管理者確認または自動処理で
takenにできる。
希望集中日の一括差し戻し
現行運用に合わせ、同じ日に希望が多い場合は対象者をまとめて差し戻せるようにする。
- 管理者が月別カレンダーで希望集中日を開く。
- その日の希望者一覧、クラス、職種、残日数、過去取得状況を確認する。
- 管理者が「この日の未承認希望を一括差し戻し」を実行する。
- 差し戻し理由を必須入力する。
- 対象申請は
needs_resubmissionになり、職員の画面に再提出待ちとして表示される。 - 元の希望日は履歴として残す。
一括差し戻し後も、管理者が一部職員だけ個別承認する運用を妨げない。
承認取消・職員取消
- 職員は
requestedまたはneeds_resubmissionの申請を自分で取り下げられる。 approvedの申請は、職員から取消希望を出し、管理者が取消する。- 取得済み
takenの記録は職員本人では取消できない。管理者調整として履歴を残す。
残日数計算
基本
残日数は、付与ロットと取得実績から計算する。
残日数 = 付与日数 + 管理者調整日数 - 取得済み日数 - 承認済み未来予定日数
職員本人画面では、承認済み未来予定を差し引いた「申請可能目安」を表示する。管理者画面では、取得済み日数と、未来予定込みの見込み残日数を分けて表示する。
消化順
同じ職員に複数の付与ロットがある場合は、有効期限が早いロットから消化する。管理者調整により例外処理をした場合は、調整理由を必須にする。
半日単位
- 1 日は
1.0、半日は0.5として扱う。 - 午前半休・午後半休はカレンダー上も区別して表示する。
- 半日を許可しない施設では設定で無効にする。
時間単位
初期実装ではデータモデル上の拡張余地だけ残し、画面では無効にする。時間単位を有効にする場合は、対象者範囲、1 日相当時間、取得単位を設定できるようにする。
カレンダー連携
承認済み有給は、open-hoikuict のカレンダーへ予定として反映する。
カレンダー予定に含める情報:
| 項目 | 内容 |
|---|---|
| タイトル | 職員名 休み または施設設定の表記 |
| 日時 | 取得日と取得単位 |
| 種別 | paid_leave |
| 公開範囲 | 施設設定に従う |
| 説明 | 原則空欄。理由や残日数は入れない |
同期ルール:
- 申請承認時に予定を作成する。
- 承認取消、却下、差し戻しでは予定を削除またはキャンセル扱いにする。
- 日付変更時は既存予定を更新する。
- カレンダー側で予定を直接削除した場合の逆同期は初期実装では行わず、有給管理画面を正とする。
データモデル案
paid_leave_settings
| カラム | 型 | 内容 |
|---|---|---|
id |
integer | 主キー |
is_enabled |
boolean | 機能有効化 |
allow_half_day |
boolean | 半日単位を許可 |
allow_hourly |
boolean | 時間単位を許可 |
request_deadline_days |
integer, nullable | 何日前まで申請可にするか |
allow_negative_request |
boolean | 残日数不足でも申請できるか |
calendar_sync_enabled |
boolean | 承認時にカレンダー反映するか |
calendar_id |
uuid, nullable | 反映先カレンダー |
staff_calendar_visibility |
string | name_only / count_only / private |
created_at |
datetime | 作成日時 |
updated_at |
datetime | 更新日時 |
users 追加カラム
| カラム | 型 | 内容 |
|---|---|---|
can_manage_paid_leave |
boolean | 有給管理者権限 |
paid_leave_grants
| カラム | 型 | 内容 |
|---|---|---|
id |
integer | 主キー |
staff_user_id |
uuid | 対象職員 |
base_date |
date | 基準日 |
granted_on |
date | 付与日 |
expires_on |
date, nullable | 有効期限 |
granted_days |
decimal | 付与日数 |
source |
string | manual / csv_import / auto |
memo |
string, nullable | 管理者メモ |
created_by_user_id |
uuid, nullable | 登録者 |
created_at |
datetime | 作成日時 |
updated_at |
datetime | 更新日時 |
同一職員、同一基準日の重複登録は警告する。ただし、前倒し付与など例外があり得るため、最終的には管理者が登録できる余地を残す。
paid_leave_requests
| カラム | 型 | 内容 |
|---|---|---|
id |
integer | 主キー |
staff_user_id |
uuid | 申請職員 |
start_date |
date | 開始日 |
end_date |
date | 終了日 |
unit |
string | full_day / morning_half / afternoon_half / hourly |
requested_days |
decimal | 申請日数 |
status |
string | 状態 |
staff_note |
string, nullable | 職員メモ |
manager_note |
string, nullable | 管理者メモ |
return_reason |
string, nullable | 差し戻し理由 |
reviewed_by_user_id |
uuid, nullable | 承認・差し戻し実行者 |
reviewed_at |
datetime, nullable | 承認・差し戻し日時 |
calendar_event_id |
uuid, nullable | 反映先予定 |
created_at |
datetime | 作成日時 |
updated_at |
datetime | 更新日時 |
状態:
| 状態 | 意味 |
|---|---|
draft |
下書き。初期実装では省略可 |
requested |
申請中 |
needs_resubmission |
差し戻し中 |
approved |
承認済み |
rejected |
却下 |
cancel_requested |
職員から取消希望あり |
cancelled |
取消済み |
taken |
取得済み |
paid_leave_usages
| カラム | 型 | 内容 |
|---|---|---|
id |
integer | 主キー |
request_id |
integer, nullable | 元申請 |
staff_user_id |
uuid | 対象職員 |
grant_id |
integer, nullable | 消化対象付与ロット |
target_date |
date | 取得日 |
amount_days |
decimal | 消化日数 |
unit |
string | 取得単位 |
source |
string | request / manual / csv_import |
created_by_user_id |
uuid, nullable | 登録者 |
created_at |
datetime | 作成日時 |
取得済み実績は paid_leave_requests から直接集計せず、paid_leave_usages を正とする。これにより、過去データの CSV 取り込みや管理者調整を扱いやすくする。
paid_leave_adjustments
| カラム | 型 | 内容 |
|---|---|---|
id |
integer | 主キー |
staff_user_id |
uuid | 対象職員 |
amount_days |
decimal | 増減日数 |
reason |
string | 調整理由 |
created_by_user_id |
uuid | 実行者 |
created_at |
datetime | 作成日時 |
paid_leave_audit_logs
| カラム | 型 | 内容 |
|---|---|---|
id |
integer | 主キー |
actor_user_id |
uuid, nullable | 操作者 |
target_staff_user_id |
uuid, nullable | 対象職員 |
action |
string | 操作種別 |
summary |
string | 表示用概要 |
metadata |
json | 差分や対象 ID |
created_at |
datetime | 作成日時 |
バリデーション
申請
- 開始日は終了日以前であること。
- 取得単位は施設設定で許可されたものだけ選べること。
- 同じ職員・同じ日・同じ単位の重複申請を禁止すること。
- 残日数不足の場合は警告すること。
- 差し戻し中の申請を再提出するときは、元申請の履歴を残すこと。
- 申請締切が設定されている場合、締切を過ぎた申請は管理者のみ登録できること。
承認
- 承認時点で残日数が不足する場合、管理者に強い警告を表示すること。
- 同一日の希望者が設定上限を超えている場合、警告を表示すること。
- 承認、差し戻し、却下、取消は監査ログに残すこと。
- 差し戻し理由は必須とすること。
付与・調整
- 付与日数は 0 より大きい数値であること。
- 調整理由は必須とすること。
- 有効期限切れの付与ロットは、通常申請では消化対象にしないこと。
- CSV 取り込み時は職員メールアドレスまたは職員 ID で対象者を突合すること。
CSV 入出力
付与 CSV
ファイル名例:
paid-leave-grants-{YYYY-MM-DD}.csv
列:
| 列名 | 内容 |
|---|---|
| 職員ID | users.id |
| メールアドレス | 職員メールアドレス |
| 氏名 | 表示確認用 |
| 基準日 | YYYY-MM-DD |
| 付与日 | YYYY-MM-DD |
| 有効期限 | YYYY-MM-DD |
| 付与日数 | 小数可 |
| メモ | 任意 |
取得履歴 CSV
列:
| 列名 | 内容 |
|---|---|
| 職員ID | users.id |
| メールアドレス | 職員メールアドレス |
| 氏名 | 表示確認用 |
| 取得日 | YYYY-MM-DD |
| 取得単位 | full_day / morning_half / afternoon_half |
| 取得日数 | 1.0 / 0.5 |
| 由来 | request / manual / csv_import |
| メモ | 任意 |
取得記録 CSV
列:
| 列名 | 内容 |
|---|---|
| 職員ID | users.id |
| 氏名 | 職員名 |
| 基準日 | 有給付与サイクルの基準日 |
| 付与日数 | 付与日数 |
| 取得日 | 有給を取得した日 |
| 取得日数 | 取得日数 |
| 残日数 | 出力時点の残日数 |
API・ルーティング案
| メソッド | パス | 用途 |
|---|---|---|
| GET | /staff/paid-leaves/me |
職員本人の有給画面 |
| POST | /staff/paid-leaves/requests |
有給希望を申請 |
| POST | /staff/paid-leaves/requests/{request_id}/withdraw |
申請取り下げ |
| POST | /staff/paid-leaves/requests/{request_id}/cancel-request |
承認済み予定の取消希望 |
| GET | /paid-leaves/ |
管理者向け一覧 |
| GET | /paid-leaves/staff/{staff_user_id} |
職員別台帳 |
| POST | /paid-leaves/requests/{request_id}/approve |
承認 |
| POST | /paid-leaves/requests/{request_id}/return |
差し戻し |
| POST | /paid-leaves/requests/{request_id}/reject |
却下 |
| POST | /paid-leaves/requests/{request_id}/cancel |
承認取消 |
| POST | /paid-leaves/requests/bulk-return |
同一日の希望を一括差し戻し |
| POST | /paid-leaves/grants |
付与登録 |
| POST | /paid-leaves/adjustments |
残日数調整 |
| GET | /paid-leaves/export/history.csv |
取得記録 CSV 出力 |
| GET | /paid-leaves/export/balances.csv |
残日数一覧 CSV 出力 |
| GET | /paid-leaves/settings |
設定画面 |
| POST | /paid-leaves/settings |
設定更新 |
実装メモ
- ルータは
routers/paid_leaves.pyに分離する。 - 業務ロジックは
paid_leave_service.pyに置き、残日数計算、消化順、CSV 入出力、カレンダー反映をルータから切り離す。 - テンプレートは
templates/paid_leaves/にまとめる。 - 有給管理機能のナビゲーションは
paid_leave_settings.is_enabledが true の場合だけ表示する。 - カレンダー連携は直接
Eventを操作するのではなく、サービス関数経由にする。 - 既存の
users.staff_roleだけで有給権限を判断しない。 - 実装時は SQLite の decimal 取り扱いに注意し、日数は整数の半日単位
amount_half_daysとして保存する選択も検討する。
取り外しやすい設計
この機能は、使わない施設では無効化できる前提にする。
- 設定で無効化したら、ナビゲーション、本人画面、管理者画面を非表示にする。
- 無効化しても既存データは削除しない。
- CSV 出力は無効化後も管理者だけ使える余地を残す。
- 勤怠、請求、職員ルームなどの既存機能へ直接依存させない。
- カレンダー予定は
kindまたはmetadataで有給由来と分かるようにして、無効化時に一覧・削除できるようにする。 - DB migration は追加型にし、既存テーブルの意味を変えない。
受け入れ条件
- 職員が自分の有給残日数、申請状況、取得履歴を確認できる。
- 職員が 1 日単位または半日単位で有給希望を申請できる。
- 職員は他職員の有給残日数を閲覧できない。
- 有給管理者は全職員の残日数、取得履歴、申請状況を確認できる。
- 有給管理者は申請を承認、差し戻し、却下、取消できる。
- 同一日に希望が集中した場合、対象者を一括差し戻しできる。
- 差し戻し理由が職員本人に表示される。
- 承認済み有給がカレンダーに反映される。
- 承認取消や差し戻しにより、カレンダー予定が更新または削除される。
- 付与ロットごとに残日数を計算できる。
- 有効期限が早い付与ロットから消化される。
- 取得記録 CSV に基準日、取得日、取得日数を出力できる。
- 付与、承認、差し戻し、取消、調整の監査ログが残る。
- 機能を無効化すると、有給管理画面が通常ナビゲーションから消える。
段階的な実装案
Phase 1: 台帳と残日数
can_manage_paid_leave権限を追加する。- 付与ロット、取得実績、調整、監査ログを追加する。
- 管理者が付与 CSV と取得履歴 CSV を取り込めるようにする。
- 職員本人が残日数と取得履歴を確認できるようにする。
Phase 2: 希望申請と承認
- 職員本人の希望申請フォームを追加する。
- 管理者の未処理一覧、承認、差し戻し、却下を追加する。
- 同一日の一括差し戻しを追加する。
- 承認済み未来予定を残日数見込みに反映する。
Phase 3: カレンダー連携と出力
- 承認済み有給をカレンダーへ反映する。
- 承認取消・差し戻し時にカレンダーを更新する。
- 取得記録 CSV、残日数一覧 CSV を出力する。
Phase 4: 運用高度化
- 申請締切、職種別上限、クラス別上限を設定できるようにする。
- 期限切れが近い有給の通知を追加する。
- Google カレンダーからの初回移行支援を検討する。
- 時間単位年休を施設設定で有効化できるようにする。
未決事項
- 園長・事務職員を既存ロールで表すか、職員ごとの権限フラグで表すか。
- 職員同士に「誰が休む予定か」を名前付きで見せるか、人数だけにするか。
- 半日単位を初期状態で有効にするか。
- 有給理由を入力欄として残すか、メモだけにするか。
- 希望集中時の判断材料として、過去取得回数や前回差し戻し回数を表示するか。
- 付与日数の自動計算を行うか、当面は管理者入力・CSV 取り込みにするか。
- 既存 Google フォーム・カレンダーの過去データをどの範囲まで移行するか。