月報作成ロジックはこんな感じになりました。
重複チェック
既に月報が作られている場合はエラーとします。
月報元データ取得
打刻データの取得
月報集計期間内の打刻データを取得します。
打刻データと契約データをINNER JOINして取得するイメージです。
このデータをもとにして月報を作成します。
休憩時間データの取得
当システムで変形労働時間制を選択した場合、毎日別々の休憩時間を設定することができます。
1日ごとに、どの時間帯が休憩時間にあたるかを示すデータを取得します。
月報作成
打刻データの加工
ニュートラル打刻データの判定
当システムでは、打刻の際に開始・終了どちらにあたるかを指定せずに、日時だけを登録することができます。(ユーザーが開始・終了を選択する手間を減らすため)
月報作成のときには、打刻が開始・終了どちらにあたるかを明示的に判定しておかないと、考えることが増えて都合が悪いです。そこで、月報作成の直前に判定処理を行います。
・1労働日のなかで最初の打刻データがニュートラル打刻である場合→開始
・1労働日のなかで最後の打刻データがニュートラル打刻である場合→終了
という具合に判定します。
打刻データの補完
・1日の最初の打刻が終了打刻であり、その後に開始打刻がある場合、終了~開始までの間は休憩として扱います。
・労働日を跨いで休憩打刻をした場合に備えて、直前の日の打刻が休憩開始で終わっている場合、日付変更線~最初の打刻までの時間を休憩として扱います。
・打刻時刻から秒以下の要素を削除します
法定休日のシフト処理
法定休日に出勤している場合、同じ週の中で休日を探して、出勤していない休日を見つけた場合は法定休日として扱います。
1日分のデータを作成
月報の1行に相当するデータを作ります。
打刻データを「1計上日ごと」「1日の中に存在する契約データごと」にグループ化します。このグループ単位で実動時間などを計算して、最後に1日分のデータとしてマージします。
各種時間の計算
契約データに紐付くロジック名に基づき、計算ロジックを実行します。
- 実働時間や超過労働時間の計算
- 休日出勤判定
- 代休発生判定
チェック処理
- 半休の利用時間帯が、労働した時間帯を包含している場合はエラーとする
- チケットの消費ポイント計算を再度実施し、消費ポイントが異なる場合はエラーとする
チケットのポイントチェックについて
例えば1年後の日付を対象に有休取得申請をした場合、当日までの間に契約(勤務形態)が変わる可能性があります。特に時短勤務になった場合は有休の消費ポイントが変化するため、データの不整合が発生します。そのままの状態で登録されないように、月報を作る時点でチェック処理を行います。
月報全体のデータを作成
一定期間内での超過労働時間を計算
- 1週間の実働時間合計が40時間(44時間)を超えた場合、超過労働時間として計上する(フレックス以外)
- フレックスタイム制である場合、不足した労働時間を次の清算期間に繰り越す
- フレックスタイム制である場合、清算期間を1か月ごとに区分したときの各区分内で労働時間の平均が週50時間を超えた場合に超過労働時間として計上する
- 変形期間・清算期間内での実働時間が1週間あたり40時間を超えた場合、超過労働時間として計上する
実動時間の集計
上記で計算した1日ごとの実働時間などを合計します。
限度時間外労働時間を計算
上記で集計した超過労働時間が限度時間を超えた場合、限度時間外労働時間として計上します。
整合性チェック
- 実動時間が0を超えているとき、有休・欠勤を使うことはできない
月報登録
上記で作った月報データをDBに登録します。
登録後も処理が続きますが、一旦DBに保存した方が実装が楽という理由によるものです。
登録後処理
代休の計上
月報集計期間中に発生した代休は、全て労働時間(賃金)として計上します。
これにより賃金の未払いを防ぎます。
代休の権利を賃金に変換したことになるため、代休の権利は消滅させても良いのですが、無給代休として残すこともできます(デフォルトロジックでは無給代休を残します)。
有休の買い上げ
月報集計期間の開始時点で既に有効期限が切れている有休を実働時間(賃金)に加算する処理です。
有休の権利が消滅する瞬間の契約データ(所定労働時間)をもとに、有休で休めたはずの時間を実動時間に加算します。