スタッフの有給時間を算出できる Web ページを作成するように依頼されましたが、控除と残業を計算するロジックに頭がおかしくなりました。
スタッフは毎月支払われますが、欠勤は給与から差し引かれる前にその週の残業から差し引かれます。ほとんどの週、これは問題ではなく、欠勤後に OT が残っているかどうかを調べることができます。値が負の場合、OT の支払いはなく、有給時間がさらに削減されます。
ただし、週の半ばに始まる月の始まりを計算する必要があります。ここでロジックが難しくなります。従業員が 8 月 1 日水曜日に 4 時間残業したとしても (たとえば)、7 月 31 日火曜日に 7.5 時間欠勤した場合などです。もちろん、残業代をいくらか差し引く必要があります。
これは、すでに 7 月の給与から欠勤分を差し引いているという事実によってさらに複雑になりますが、これらの時間の一部が 2 倍の時間であったという事実を説明する必要があります。
私はまず残業のバランスを計算することによってこれに取り組みました-月の開始の両側の週の欠勤。これにより、次の 4 つの結果が生じる可能性があります。
- 週の後半の OT 時間のバランスがプラスであり、週の前半の控除のバランスがマイナスである
- 週の前半の OT 時間のバランスがプラスであり、週の後半の控除のバランスがマイナスである
- 週の両方の部分でOTのバランスが正またはゼロです
- 週の両方の部分で控除の残高がマイナスまたは 0 である
最後の 2 つの場合は何もする必要はありませんが、前者の場合は、その週の休暇を補うために今月の給与を調整する必要があります。最後の変化球を入れると、残業時間は2倍、控除は通常時間です。つまり、7 月 31 日火曜日に 7.5 時間欠勤し、8 月 1 日水曜日に 4 時間勤務した場合、控除の最初の 4 時間は 2 倍になり、11.5 時間の控除になりますよね? 4 時間の OT を失うだけで計算することはできません。なぜなら、7 月には既に 7.5 時間の有給労働を失っているため、失われる有給時間は 4 時間、つまり 2 時間の OT だけであるはずです。
これまでの私のコードは、私の能力の限りコメントされています。私は残業と控除の値が各インスタンスでどのようなものかを理解しようとしています:
//get imbalances
$pre = $preOvertime - abs($preDeductions);
$post = $postOvertime - abs($postDeductions);
/* FOUR POSSIBILITIES: */
// need to reduce ot hours from pre by absence hours from post to compensate
if($pre > 0 AND $post < 0){
if(($pre - abs($post)) < 0){
// compensating for too much time off
// in first partial week of month
$weeklyminus = ??????;
$weeklyOT = ??????;
} else {
// compensating for too much time off
// in last partial week of last month
$weeklyminus = ??????;
$weeklyOT = ??????;
}
}
// need to reduce ot hours from post by absence hours from pre to compensate
if($pre < 0 AND $post > 0){
// if paid hrs OT is less than hours absence
if(abs($pre) < $post){
// deduct the amount of absence in normal hours
$weeklyminus = abs($pre); //since we already paid for it once, reduce further with single time hours
$weeklyOT = $post; //double time hours
} else {
// the most you can take is $post paid normal hours
$weeklyminus = $post; //since we already paid for it once, reduce further with single time hours
$weeklyOT = $post; //double time hours
}
}
// negative hours both sides, no remaining OT hours to reduce
if($pre <= 0 AND $post <= 0){
$weeklyOT = $postOvertime;
$weeklyminus = $postDeductions;
}
// positive hours both sides, no need to reduce hours to compensate
if($pre >= 0 AND $post >= 0){
$weeklyOT = $postOvertime;
$weeklyminus = $postDeductions;
}
誰かがこれにアプローチするより簡単な方法を考えることができれば、私はそれを大いに感謝します.これはしばらくの間私を夢中にさせてきました. 私がここに投稿する理由の 1 つは、それが明確になることを期待して、それを明確にレイアウトすることを強制することですが、正直なところ、私は木に対して森を見ることができず、外部の目が必要であると感じ始めています.
前もって感謝します。