0

我被要求写一个可以计算员工带薪小时数的网页,但计算扣除额和加班费的逻辑让我抓狂。

员工按月支付工资,但任何缺勤都会从该周的加班中扣除,然后再从工资中扣除。大多数情况下,这不是问题,我可以计算出缺勤后是否还有加班,如果值为负,则不支付加班费,并进一步减少带薪工时。

但是,我必须计算月初,可能在周中开始。这就是逻辑变得困难的地方,因为员工可能在 8 月 1 日星期三加班了 4 小时(例如),但在 7 月 31 日星期二有 7.5 小时缺勤。显然我们需要扣除一些加班费。

由于我们已经从 7 月份的工资中扣除了缺勤的事实,这使情况变得更加复杂,但我们需要考虑到其中一些时间是双倍时间的事实。

我首先通过计算加班的余额来解决这个问题 - 一个月开始的每一周的缺勤。这可能导致四种可能的结果:

  • 一周后半部分加班时数为正余额,前半周扣减时数为负数
  • 前一周加班时数为正余额,后半周扣减时数为负数
  • 一周中的两个部分都有正或 0 的 OT 余额
  • 本周两个部分的扣除额余额为负数或 0

在最后两种情况下,我不需要采取任何行动,但在前两种情况下,我需要调整本月的工资以弥补那一周的休息时间。只是为了扔最后一个曲线球,加班时间是双倍时间,扣分是正常时间。这意味着如果我在 7 月 31 日星期二缺勤 7.5 小时,而在 8 月 1 日星期三加班加班 4 小时,那么前四个小时的扣款应该是双倍时间,导致 11.5 小时的扣款对吧?只是我不能计算只是失去了4小时的加班,因为7月份我已经失去了7.5小时的带薪工作,所以我应该只损失4小时的带薪工作,也就是2小时的加班。

到目前为止,这是我的代码,尽我所能评论。我正在尝试计算每种情况下加班和扣除的价值:

//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;
}

如果有人能想到一种更简单的方法来解决这个问题,我将不胜感激,这让我发疯了一段时间。我在这里发帖的部分原因是强迫自己清楚地展示它,希望它能给我一些清晰度,但老实说,我开始觉得我不能只见树木不见树林,需要一个外在的眼睛。

提前致谢。

4

0 回答 0