我正在寻找一些基本的出勤逻辑。到目前为止,我所做的是员工可以单击两种不同类型的按钮,并使用一个按钮将自己标记为已登录、已注销(状态 1 和 2),并使用另一个按钮将其标记为 Break Start、Break Over(状态 3 和 4)按钮。
现在,当我计算员工在特定日期的总登录时间和总休息时间时,我会执行以下操作。
- 首先遍历我想查看工作时间的开始日期和结束日期的循环。
- 现在首先通过查找该日期的状态 1 条目来检查员工是否在特定日期登录。
- 如果员工在该日期登录,那么我会获取该日期的所有出勤记录。
- 现在我遍历这个日期的出勤记录,将时间差加起来从第一个状态 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;
}