Appearance
労働時間制と時間外の判定
KIZAMI が扱う労働時間制ごとに、時間外労働をいつ・何と比べて判定するかをまとめます。 この判定の違いが、月次一覧に出る列の違いにそのまま表れます。
対象読者は実装者とレビュアーです。労務担当者向けの説明は VitePress のガイド側にあります。
制度によって「時間外」の意味が変わる
| フレックスタイム制 | 固定時間制 | |
|---|---|---|
| 判定の単位 | 清算期間(1ヶ月) | 1日 と 1週 |
| 比べる相手 | 月の総枠 | 1日8時間 / 1週40時間 |
| 日別の法定時間外 | 存在しない | 存在する |
| 根拠 | 労基法32条の3 | 労基法32条 |
フレックスで1日10時間働いても、清算期間の総枠に収まっていれば時間外ではありません。 日別の法定時間外が出ないのは実装漏れではなく、法律上そうであるということです。 このため月次一覧では、フレックスのとき時間外列を出しません。出すと「今日は時間外0だった」 という誤った理解を与えます。
逆に固定時間制では、月末を待たずにその日のうちに時間外が確定します。
固定時間制の判定順序
二重計上を防ぐため、必ず日次 → 週次の順で計算します。
日ごと:
日次法定時間外 = max(0, 実労働 − 1日の法定労働時間(480分))
法定内労働 = 実労働 − 日次法定時間外
週ごと(週起算曜日から7日):
法定内労働を日付昇順に累積し、週の法定労働時間を超えた分を
その日の週次法定時間外とする先に週で判定すると、1日8時間超として既に時間外にした分を週の集計にも入れてしまい、 同じ労働を二度数えます。
所定外だが法定内(いわゆる法定内残業)は割増賃金の対象外ですが賃金は発生するため、 extraWithinStatutoryMinutes として法定時間外と区別して保持します。所定7時間の会社で 7時間30分働いた30分がこれにあたります。
法定休日の労働は日次・週次のどちらの計算からも除外し、legalHolidayMinutes として 別枠で持ちます(割増率が異なるため。労基法37条1項)。
1日8時間は特例措置対象事業場でも変わらない
特例措置対象事業場(商業・映画演劇業・保健衛生業・接客娯楽業のうち常時10人未満)で 緩和されるのは週の法定労働時間だけ(40時間 → 44時間)で、1日8時間は動きません。 労基法40条・労基則25条の2。
このため LawRules は dailyStatutoryMinutes と weeklyStatutoryMinutes を別に持ち、 テナント属性 isSpecialProvisionWorkplace は後者にだけ効きます。
週の起算曜日
週40時間の判定には週の区切りが要ります。就業規則に定めがなければ日曜起算が原則 (昭和63年基発第1号)なので、tenant_setting_versions.week_start_weekday の既定は 0(日曜)です。
月をまたぐ週は、その月の期間内にある日だけで判定します。 前月分を引きずりません。 月次集計の独立性(締めた月が後から動かない)を優先した割り切りで、月初の週で週次法定時間外が 実際より少なく出ることがあります。清算を厳密にする場合は週次の締めが必要になるため、 将来の課題として残しています。
有給の扱いが制度で違う
| フレックス | 固定時間制 | |
|---|---|---|
| 有給取得日 | 総枠に算入(actualMinutes に足す) | 時間外判定に関与しない |
フレックスでは「働いたことにして総枠と比べる」必要があります。有給を取った日を0分として 扱うと、その月だけ総枠不足になり不当な控除につながるためです。
固定時間制では、有給は所定労働日の欠勤を打ち消すだけで、1日8時間・週40時間という 実労働に対する上限とは無関係です。有給を足して週40時間を超えたことにするのは誤りです。
期間の途中で制度が変わったら
settingsTimeline の span ごとに労働時間制が変わりえます(契約変更など)。 エンジンは期間開始日に有効だった制度で月全体を計算し、期間内に別の制度が混在していれば mixed_work_system 警告を出します。
これは「閾値は期間開始日基準」という既存の流儀(flex.ts の判断点コメント参照)と揃えたものです。 月の途中で制度が切り替わる運用を正しく集計するには、清算期間を分割して2本の集計を 合成する必要があり、現時点では警告で気づかせるにとどめています。
未実装の制度
- 変形労働時間制(1ヶ月単位・1年単位。労基法32条の2 / 32条の4) — 週の法定労働時間を 期間平均で判定する。所定労働時間をあらかじめ日ごとに特定する必要があるため、 シフト表の入力が前提になる
- 事業場外みなし労働時間制(労基法38条の2)
- 裁量労働制(専門業務型・企画業務型。労基法38条の3 / 38条の4)
いずれも WorkSystem の判別可能ユニオンに派生を足す形で入ります。 EngineOutput.workSystem を見て表示を変える作りにしてあるため、UI 側の分岐も同じ場所で済みます。