PHP计算员工工作时间的困难逻辑

时间:2013-08-22 08:07:50

标签: php logic business-logic

我被要求写一个可以计算员工工时的网页,但计算扣除和加班的逻辑让我很生气。

员工每月支付一次,但任何缺勤都会从那几周中扣除,然后才会从工资中扣除。大多数星期这不是一个问题,我可以弄清楚在缺席后是否有剩余的OT,如果价值为负,则没有OT支付和进一步减少支付小时数。

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

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

我已经通过首先计算加班余额来实现这个目标 - 本月开始时每周缺勤。这可能导致四种可能的结果:

  • 本周后半段的OT时间有正余额,本周前一部分的扣除余额为负余额
  • 本周前一个星期的OT小时数有正余额,而本周后半期的扣除余额为负余额
  • 本周两个部分都有正余额或0欧元余额
  • 本周两个部分的扣除额均为负数或0余额

在最后两个例子中,我不需要采取任何行动,但是在前者的情况下,我需要调整这个月的工资以补偿那一周的休假。只是扔掉最后一个曲线球,加班时间是双倍时间,扣除是正常时间。这意味着如果我在7月31日星期二缺席7.5小时并且在8月1日的Weds上工作4小时,那么扣除的前四个小时应该是双倍时间,导致11.5小时的扣除对吗?只有我无法计算它只是失去了4小时的OT,因为在7月我已经失去了7.5小时的有偿工作,所以我应该只损失4小时的工资,这是OT的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;
}

如果有人能想出更简单的方法来解决这个问题,我会非常感激,这让我疯狂了一段时间。我在这里发布的部分原因是强迫自己明确地说出它希望它给我一些清晰度,但老实说,我开始觉得我看不到树林里的树木需要外面的眼睛。

提前致谢。

0 个答案:

没有答案