基本的な出席ロジックを探しています。私がこれまで行ってきたことは、従業員が 2 種類のボタンをクリックし、一方のボタンを使用してサインイン、サインアウト (ステータス 1 および 2) としてマークし、もう一方のボタンを使用してブレイク スタート、ブレイク オーバー (ステータス 3 および 4) としてマークできることです。ボタン。
特定の日付の従業員の合計サインイン時間と合計休憩時間を計算すると、次のようになります。
- 最初に、勤務時間を確認したい開始日と終了日のループを繰り返します。
- まず、その日付のステータス 1 エントリを見つけて、従業員が特定の日付にログインしたかどうかを確認します。
- 従業員がその日にログインした場合、その日のすべての出勤記録を取得します。
- ここで、この日付の出席レコードを反復処理して、最初のステータス 1 (つまり、ログイン) から次のステータスまでの時間差と、次のステータス (ブレーク スタート 3 またはログアウト 2 のいずれか) から次のステータス (ブレークオーバー 4 またはログイン 1) のいずれかです。
これはうまく機能しており、私の勤務時間の計算は順調に進んでいます。
ただし、理解できない論理的な部分が 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;
}