我正试图找到一个解决方案,以获得总工作时间、迟到(分钟)、早退或未按时(分钟)和加班时间。
以下是我使用的函数:
午休时间:下午12:30
午休时间:下午1:30
办公室班次:周一至周五上午8:30至下午5:30
如果迟到时间超过30分钟,员工将自动迟到4小时:
$time_in_day = date('N', strtotime($time_in_date));
$time_in = strtotime($time_in);
$company_details = $this->get_data_details_one_parameter('company', 1);
$start_lunch_break = strtotime($company_details[0]['START_LUNCH_BREAK']);
$end_lunch_break = strtotime($company_details[0]['END_LUNCH_BREAK']);
$office_shift_details = $this->get_data_details_two_parameter('office shift', $employee_id, $time_in_day);
$office_shift_time_in = strtotime($office_shift_details[0]['TIME_IN']);
if($time_in >= $end_lunch_break){
$late = (round(($time_in - $end_lunch_break) / 3600, 2)) * 60;
}
else{
$late = (round(($time_in - $office_shift_time_in) / 3600, 2)) * 60;
}
if($late <= 0){
$late = 0;
}
if($late > 30){
$late = (round(($start_lunch_break - $office_shift_time_in) / 3600, 2)) * 60;
}
return $late;
对于计算早退/未充分工作时间,如果未充分工作时间>30分钟,员工将自动提前4小时:
$time_in_day = date('N', strtotime($attendance_time_out_date));
$attendance_time_out = strtotime($attendance_time_out);
$company_details = $this->get_data_details_one_parameter('company', 1);
$end_lunch_break = strtotime($company_details[0]['END_LUNCH_BREAK']);
$office_shift_details = $this->get_data_details_two_parameter('office shift', $employee_id, $time_in_day);
$office_shift_time_out = strtotime($office_shift_details[0]['TIME_OUT']);
$early_leaving = (round(($office_shift_time_out - $attendance_time_out) / 3600, 2)) * 60;
if($early_leaving <= 0){
$early_leaving = 0;
}
if($early_leaving > 30){
$early_leaving = (round(($office_shift_time_out - $end_lunch_break) / 3600, 2)) * 60;
}
return $early_leaving;
计算总工作时数:
$total_hours = 0;
$time_in_day = date('N', strtotime($attendance_time_in_date));
$office_shift_details = $this->get_data_details_two_parameter('office shift', $employee_id, $time_in_day);
$office_shift_time_in = strtotime($attendance_time_in_date . ' ' . $office_shift_details[0]['TIME_IN']);
$attendance_time_in = strtotime($attendance_time_in_date . ' ' . $attendance_time_in);
$attendance_time_out = strtotime($attendance_time_out_date . ' ' . $attendance_time_out);
$company_details = $this->get_data_details_one_parameter('company', 1);
$start_lunch_break = strtotime($attendance_time_in_date . ' ' . $company_details[0]['START_LUNCH_BREAK']);
$end_lunch_break = strtotime($attendance_time_in_date . ' ' . $company_details[0]['END_LUNCH_BREAK']);
if($attendance_time_in >= $end_lunch_break){
if($attendance_time_in >= $office_shift_time_in){
$time_in = $attendance_time_in - $end_lunch_break;
}
else{
$time_in = $office_shift_time_in - $end_lunch_break;
}
}
else{
if($attendance_time_in >= $office_shift_time_in){
$time_in = $attendance_time_in - $start_lunch_break;
}
else{
$time_in = $office_shift_time_in - $start_lunch_break;
}
}
if($attendance_time_out <= $start_lunch_break){
$time_out = $attendance_time_out - $start_lunch_break;
}
else{
$time_out = $attendance_time_out - $end_lunch_break;
}
$total_hours = (round(abs($time_in - $time_out) / 3600, 2));
if($total_hours <= 0){
$total_hours = 0;
}
return floor($total_hours);
以下是我的困境:
我无法正确计算每天工作的总小时数,因为正如您在我的代码中所看到的,我总是以午休时间的总小时数为基础。
我无法取消同一日期多次进出的迟到和未到时间,例如:一名员工的时间为上午8:30,下午12:30,同一名员工的时间为下午1:30,下午5:30(同一日期)。该示例的输出将是数据库中的2个条目如果每天有多个时间输入和输出,如何取消迟到和未到时间?
产出1
日期时间:2021年7月27日
时间:上午8:30
暂停时间:下午12:30
迟到:0分钟
不足时间:240分钟/4小时
工作总时数:4小时
产出2
日期时间:2021年7月27日
时间:下午1:30
暂停时间:下午5:30
迟到:240分钟/4小时
不足时间:0分钟
工作总时数:4小时
暂无答案!
目前还没有任何答案,快来回答吧!