0

我正在寻找一些基本的出勤逻辑。到目前为止,我所做的是员工可以单击两种不同类型的按钮,并使用一个按钮将自己标记为已登录、已注销(状态 1 和 2),并使用另一个按钮将其标记为 Break Start、Break Over(状态 3 和 4)按钮。

现在,当我计算员工在特定日期的总登录时间和总休息时间时,我会执行以下操作。

  1. 首先遍历我想查看工作时间的开始日期和结束日期的循环。
  2. 现在首先通过查找该日期的状态 1 条目来检查员工是否在特定日期登录。
  3. 如果员工在该日期登录,那么我会获取该日期的所有出勤记录。
  4. 现在我遍历这个日期的出勤记录,将时间差加起来从第一个状态 1(即登录)到下一个状态以及从下一个状态(可以是休息开始 3 或注销 2)到下一个状态(即可以突破 4 或登录 1)。

这很好用,我的工作时间计算也很好。

但是,有一个我无法理解的逻辑部分,即如果员工没有在我提取记录的同一日期注销,那么从上次登录或中断开始到注销的时间跨度没有得到计算. 因为最终注销状态与我获取记录的日期不同。

因此,我需要一些帮助来理解如何管理这方面的任何建议,以及如果员工的注销状态与登录日期不同,我该如何计算工作时间。

提前致谢。

这是一些代码。

public function getEmployeeAttendance($company_uid , $emp_uid)
{
    for($m=1; $m<=12; $m++)
    {
        $mon = strtotime(date('Y-' . $m . '-00'));

        $first = date("Y-m-01", $mon); // First Date Of cuRRENT mONTH
        $last = date("Y-m-t", $mon); // Last Date Of cuRRENT mONTH
        $date[] = range_date($first, $last);
    }

    $atten = array();

    //echo "<pre>";

    foreach($date as $dt)
    {
        foreach($dt as $d)
        {
           // A function to check if there was a status 1 on this date
            $myAttendance = $this->Attendance_Model->myAttendance($company_uid , $emp_uid, $d);

            # If Employee Signed In on This Date (i.e. Status was 1)
            if(count($myAttendance) >0)
            {
                # Calculate Working Hours
                $attenRec = $this->Attendance_Model->getAttendanceRecords($company_uid , $emp_uid, $d);

                $signInHrs = 0;
                $breakHrs = 0;
                $workingHrs = 0;

                for($i=0; $i<count($attenRec); $i++)
                {
                   // Get this record's status                      
                    $status = $attenRec[$i]['status'];

                   // Get next record's status
                    if(!empty($attenRec[$i + 1]))
                    {
                        if($status == '1' || $status == '4')    // Sign In or Break Over
                        {                               
                            $thisTime = strtotime($attenRec[$i]['atten_time']);
                            $nextTime = strtotime($attenRec[$i + 1]['atten_time']);
                            $diff = round(($nextTime - $thisTime) / 3600, 2);
                            $signInHrs += $diff;
                        }                           

                        if($status == '3')  // Break Start
                        {                               
                            $thisTime = strtotime($attenRec[$i]['atten_time']);
                            $nextTime = strtotime($attenRec[$i + 1]['atten_time']);
                            $diff = round(($nextTime - $thisTime) / 3600, 2);
                            $signInHrs += $diff;

                            $breakHrs += $diff;
                        }

                    }

                }

                $onlySignInHrs = floor($signInHrs);
                $remainingSignInHrs = $signInHrs - $onlySignInHrs;
                $signInMinutes = round($remainingSignInHrs * 60);

                $myAttendance['signInHrs'] = $onlySignInHrs . " Hrs : " . $signInMinutes . " Min";

                $onlyBreakHrs = floor($breakHrs);
                $remainingBreakHrs = $breakHrs - $onlyBreakHrs;
                $breakMinutes = round($remainingBreakHrs * 60);

                $myAttendance['breakHrs'] = $onlyBreakHrs . " Hrs : " . $breakMinutes . " Min";

                $workingHrs = $signInHrs - $breakHrs;
                $onlyWorkingHrs = floor($workingHrs);
                $remainingWorkingHrs = $workingHrs - $onlyWorkingHrs;
                $workingMinutes = round($remainingWorkingHrs * 60);

                $myAttendance['workingHrs'] = $onlyWorkingHrs . " Hrs : " . $workingMinutes . " Min";
            }

            # Save This Date's Attendance
            $atten[] = $myAttendance;

        }

    }

    return $atten;
}
4

0 回答 0