0

我正在尝试使用 Laravel 创建一个简单的考勤应用程序。我只是有点坚持逻辑方面。我要做的是将用户的时间日志与正确的时间表相匹配。

所以在我们的办公室里,我们可以有 2 到 3 次休息,所以一个典型的工作班次应该是这样的:

Time In     - 06:00 AM
Break Out 1 - 07:15 AM
Break In 1  - 07:30 AM
Break Out 2 - 11:30 AM
Break In 2  - 12:00 PM
Time Out    - 03:00 PM

现在用户通常只使用生物识别设备并选择“输入”或“输出”。

我的问题是这样的:

05:58 AM, in
07:17 AM, out
07:31 AM, in
05:58 AM, out

系统如何判断哪个时间日志(07:17 AM)属于哪个时间段(Break Out 1)?

非常感谢您的帮助,如果我的问题不清楚,我很抱歉。

这是我到目前为止所做的示例代码。它有效,但我认为它真的很乱:

$day_shift = [
    "time_in" => date('H:i:s', strtotime("06:00 AM")),
    "break_out_1" => date('H:i:s', strtotime("07:15 AM")),
    "break_in_1" => date('H:i:s', strtotime("07:30 AM")),
    "break_out_2" => date('H:i:s', strtotime("11:30 AM")),
    "break_in_2" =>  date('H:i:s', strtotime("12:00 PM")),
    "break_out_3" => '',
    "break_in_3" => '',
    "time_out" =>  date('H:i:s', strtotime("03:00 pM")),
];


foreach ($day_shift as $key => $userScheduleTime) {
    if ($userScheduleTime !== "") {
        $time = $logDate->date." ".$userScheduleTime;
    } else {
        $time = "";
    }
    $schedules[] = array('time' => $time, 'type' => $types[$i%2],'name'=>$key);
    $i++;
}

// logTimes is a collection of time logs

foreach ($logTimes as $logTime) {
    $logs[] =  $logTime->toArray();
}
$cloneLogs = $logs;
$lastlog = end($cloneLogs);
if ($lastlog["log_type"] == "login") {
    $dayOut = "";
} else {
    $dayOut = $lastlog["log_time"];
}
$lastout = null;
$size = count($logs);
do {
    if ($logs[$size-1]['log_type'] == 'logout') {
        $lastout = $logs[$size-1];
        break;
    }
    $size--;
} while ($size > 0);

$lastlog = null;

for ($i = 0; $i < count($schedules); $i++) {
    $logTime = current($logs);
    if ($lastlog == $logTime['log_type']) {
        next($logs);
    }
    // checks the first log, calculates how late the person is
    if ($i == 0) {
        if ($logTime['log_type'] == "login") {
            $timein = $schedules[0]['time'];

            if (strtotime(date("Y-m-d H:i", strtotime($logTime['log_time']))) >
                strtotime(date("Y-m-d H:i", strtotime($timein)))) {
                $lates[$logTime['log_time']] = true;
                $lates["totallate"] += getDifferenceInMinutes($logTime['log_time'], $timein);
            }
            $lastlog = $logTime["log_type"];
            next($logs);
        }
    }

    if ($schedules[$i]['type']==$logTime['log_type'] && $i!=0 && $lastlog !== $logTime["log_type"]) {
        $nextSched = isset($schedules[$i+1])?$schedules[$i+1]:$schedules[$i];
        $j = 1;
        while ($nextSched['time']=="" && ($i+$j)<=count($schedules)) {
            $nextSched = $schedules[$i+$j];
            $j++;
        }

        if (strtotime($nextSched['time'])>strtotime($logTime['log_time']) && $logTime["log_time"] != $dayOut) {

            // checks and calculates if the user has undertime        
            if (strtotime($nextSched['time']) > strtotime($logTime['log_time']) && $nextSched['type']=='login') {
                if (strtotime($logTime['log_time']) < strtotime($schedules[$i]['time'])) {
                    $lates[$logTime['log_time']] = true;
                    $lates["totalunder"] += getDifferenceInMinutes($logTime['log_time'], $schedules[$i]['time']);
                }
            }

            // checks and calculates if the user has overbreaks
            if (date('H:i', strtotime($schedules[$i]['time'])) <
                date('H:i', strtotime($logTime['log_time'])) &&
                $logTime['log_type'] == 'login') {
                $lates[$logTime['log_time']] = true;
                $lates["totalover"] += getDifferenceInMinutes($schedules[$i]['time'], $logTime['log_time']);
            }
            $lastlog = $logTime["log_type"];
            next($logs);
        }


        if ($i+1==count($schedules)) {
            next($logs);
        }

        if ($logTime["log_time"] == $dayOut && $dayOut !== null) {
            $timeOut = $schedules[count($schedules)-1]["time"];
            if (strtotime(date("Y-m-d H:i", strtotime($logTime["log_time"]))) <
                strtotime(date("Y-m-d H:i", strtotime($timeOut)))) {
                $lates[$logTime["log_time"]] = true;
                $lates["totalunder"] += getDifferenceInMinutes($logTime['log_time'], $timeOut);
                $lastlog = $logTime["log_type"];
            }
            break;
        }
    }
}
4

0 回答 0