LAPTOP-V9RRD1TL\Michelle's Computer f8f8fcaf96 first commit
2025-07-21 21:38:17 +08:00

454 lines
20 KiB
PHP

<?php
$must_login = true ;
$require_path = '../../' ;
$require_sub = '../' ;
require( $require_sub.'header.php' ) ;
// if ( $boolean_login ){
$status = '300' ;
$branch_name = '' ;
// Hr = All staff without branch
// HrBranch = All staff with branch
// HrManual = For M&R only
$is_show = 'no' ;
$is_filterbranch = 'no' ;
$services = $mysqli->query( "SELECT a.module FROM app_service a
WHERE a.deleted_at IS NULL AND a.type = 'service' AND a.module IN ( 'Hr', 'HrBranch', 'HrManual' ) AND on_off = 'on'
LIMIT 2" ) ;
if ( $services->num_rows > 0 ){
while ( $row_service = $services->fetch_assoc() ){
if ( $row_service['module'] == 'Hr' ){
$is_show = 'yes' ;
}
if ( $row_service['module'] == 'HrBranch' ){
$is_show = 'yes' ;
$is_filterbranch = 'yes' ;
}
if ( $row_service['module'] == 'HrManual' ){
$is_show = 'manual' ;
$is_filterbranch = 'yes' ;
}
}
}
if ( $array['module'] == 'branch' ){
$is_show = 'yes' ;
$is_filterbranch = 'yes' ;
if ( $array['branch_id'] != '' ){
$get_branch = $mysqli->query("SELECT branch_name FROM branch
WHERE deleted_at IS NULL AND branch_id = '".$array['branch_id']."' LIMIT 1") ;
if ( $get_branch->num_rows > 0 ){
$branch = $get_branch->fetch_assoc() ;
$branch_name = $branch['branch_name'] ;
}
}
}
$list = [] ;
$total_staffs = 0 ;
$present = 0 ;
$late = 0 ;
$rest_late = 0 ;
$absent = 0 ;
$merit = 0 ;
$passionate = 0 ;
$in_off = 0 ;
$in_mc = 0 ;
$in_leave = 0 ;
$in_off_working = 0 ;
$error = 0 ;
$present_list = [] ;
$late_list = [] ;
$rest_late_list = [] ;
$absent_list = [] ;
$off_list = [] ;
$mc_list = [] ;
$leave_list = [] ;
$off_working_list = [] ;
$merit_list = [] ;
$passionate_list = [] ;
$yesterday_day = date('N', strtotime('-1 days')) ;
$today_day = date('N', time()) ;
$date_yesterday = date('Y-m-d', strtotime('-1 days')) ;
$date_today = date('Y-m-d', time()) ;
$date_next = date('Y-m-d', strtotime('+1 days')) ;
if ( $is_show == 'yes' ){
// filter department
$check_department = false;
if( $department_id > 0 ){
$check_department = true ;
$search_query1 .= " AND a.department_id = '".$department_id."'" ;
}
// loop all group
$working_q = $mysqli->query("SELECT group_id, working_day, working_next_day, working_on, working_morning_start as working_period_from, working_morning_end as working_period_to, working_break_start as working_from, working_break_end as working_to, working_break_end_include_ot as working_to_include_ot, working_max_ot, working_period_before, working_total_rest_hours FROM setting_working
WHERE deleted_at IS NULL AND group_id > '0' AND ( working_day = '".$yesterday_day."' OR working_day = '".$today_day."' )") ;
$row_working = [] ;
if ( $working_q->num_rows > 0 ){
while ( $working = $working_q->fetch_assoc() ){
$row_working[$working['group_id']][$working['working_day']] = $working ;
}
}
// get all last checkin attendace
$attendance_q = $mysqli->query( "SELECT staff_id, MAX(created_at) AS created_at FROM staff_attendance
WHERE deleted_at IS NULL
GROUP BY staff_id" ) ;
$row_attendance = [] ;
if ( $attendance_q->num_rows > 0 ){
while ( $attendance = $attendance_q->fetch_assoc() ){
$row_attendance[$attendance['staff_id']] = $attendance['created_at'] ;
}
}
// get all last 4 checkin attendace
$attendance_2days_q = $mysqli->query( "SELECT staff_id, created_at FROM staff_attendance
WHERE deleted_at IS NULL AND list_id = '0' AND '".date( 'Y-m-d', time() )." 23:59:59'" ) ;
$row_attendance_2days = [] ;
if ( $attendance_2days_q->num_rows > 0 ){
while ( $attendance_2days = $attendance_2days_q->fetch_assoc() ){
$row_attendance_2days[$attendance_2days['staff_id']][] = $attendance_2days['created_at'] ;
}
}
// get all mc / unpaid / annual today
$leave_q = $mysqli->query("SELECT staff_id, leave_type FROM staff_leave_date
WHERE deleted_at IS NULL AND leave_type_mode = 'working' AND leave_date = '".$date_today."'") ;
$row_leave = [] ;
if ( $leave_q->num_rows > 0 ){
while ( $leave = $leave_q->fetch_assoc() ){
$row_leave[$leave['staff_id']] = $leave['leave_type'] ;
}
}
// get all staff
$staffs_q = $mysqli->query( "SELECT staff_id, staff_idno, staff_name, staff_image, group_id FROM staff
WHERE ( staff_date_resigned IS NULL || staff_date_resigned = '0000-00-00' || staff_date_resigned >= '".$date_today."' ) AND deleted_at IS NULL ".( $is_filterbranch == 'yes' ? " AND branch_id = '".$array['branch_id']."'" : '' )."
ORDER BY (staff_idno+0)" ) ;
if ( $staffs_q->num_rows > 0 ){
$status = '200' ;
$row_staff = [] ;
while ( $staff = $staffs_q->fetch_assoc() ){
if( $check_department ){
$mysqli_department = $mysqli->query( "SELECT a.department_id, b.department_desc FROM staff_department a
LEFT JOIN setting_department_translation b ON ( b.department_id = a.department_id )
WHERE a.deleted_at IS NULL AND b.lang = '".$array['lang']."' AND a.staff_id = '".$staff['staff_id']."'".$search_query1 ) ;
$count = 0 ;
$department_name = '' ;
if( $mysqli_department->num_rows > 0 ){
while( $row_department = $mysqli_department->fetch_assoc() ){
$count++ ;
$break = '' ;
if( $count == 3 ){
$break = "\n" ;
$count = 0 ;
}
$department_name .= $row_department['department_desc'].', '.$break ;
}
$department_name = substr( $department_name, 0, -2 ) ;
if( $department_name != '' ){
$row_staff[] = $staff ;
}
}
}else{
$row_staff[] = $staff ;
}
}
foreach ( $row_staff as $staff ){
$total_staffs++ ;
$this_working = $row_working[$staff['group_id']] ;
$this_type = '' ;
$attendance = '' ;
$last_late = '' ;
if ( arrayCheck( $this_working ) ){
// get staff attendance
$attendance = $row_attendance[$staff['staff_id']] ;
$attendance_all = $row_attendance_2days[$staff['staff_id']] ;
$attendance_first = ( isset($attendance_all[0]) ? $attendance_all[0] : '' ) ;
// check if mc / unpaid / annual leave today
$get_leave = $row_leave[$staff['staff_id']] ;
if ( $get_leave != '' ){
if ( $get_leave == 'sick' ){
$in_mc++ ;
$this_type = 'mc' ;
}
if ( $get_leave == 'unpaid' ){
$in_leave++ ;
$this_type = 'leave' ;
}
if ( $get_leave == 'annual' ){
$in_leave++ ;
$this_type = 'leave' ;
}
}else{
// check today day working
$working = $this_working[$today_day] ;
$check_current_datetime = $date_today.' '.$working['working_period_from'] ;
$check_next_datetime = $date_next.' '.$working['working_period_to'] ;
$working_from = $date_today.' '.$working['working_from'] ;
if ( $working['working_period_before'] > 0 ){
$working_from = $date_today.' '.addTime( $working['working_from'], convertToTimes($working['working_period_before']) ) ;
}
$working_to = $date_today.' '.$working['working_to'] ;
$working_to_include_ot = $date_today.' '.$working['working_to_include_ot'] ;
$working_max_ot = $working['working_max_ot'] ;
if ( $working_from > $working_to ){
$working_to = $date_next.' '.$working['working_to'] ;
}
if ( $working['working_to_include_ot'] != '' && $working['working_to_include_ot'] != '00:00:00' ){
$working_to = $date_next.' '.$working['working_to_include_ot'] ;
}
if ( $working_max_ot != '' && $working_max_ot != '00:00:00' ){
$convertMinutes = convertMinutes($working_max_ot) ;
$working_to = date("Y-m-d H:i:s", strtotime($working_to . ' + '.$convertMinutes.' minutes')) ;
}
// check if allow to insert attendances
if ( TODAYDATE >= $check_current_datetime ){
// this guys is working within this day
}else{
if ( $attendance >= $working_to ){
// this guys is working within this day
}else{
if ( date('Y-m-d', strtotime($attendance)) == $yesterday_day ){
// check yesterday day working
$working = $this_working[$yesterday_day] ;
$check_current_datetime = $date_yesterday.' '.$working['working_period_from'] ;
$check_next_datetime = $date_today.' '.$working['working_period_to'] ;
$working_from = $date_yesterday.' '.$working['working_from'] ;
$working_to = $date_yesterday.' '.$working['working_to'] ;
$working_max_ot = $working['working_max_ot'] ;
if ( $working_from > $working_to ){
$working_to = $date_today.' '.$working['working_to'] ;
}
if ( $working['working_to_include_ot'] != '' && $working['working_to_include_ot'] != '00:00:00' ){
$working_to = $date_today.' '.$working['working_to_include_ot'] ;
}
}
}
}
$working_to_10 = date("Y-m-d H:i:s", strtotime($working_to . ' + 10 hours')) ;
if ( $working['working_if_flexi'] == 'yes' ){
$working_from = $check_current_datetime ;
$working_to = $check_next_datetime ;
}
if ( $working["working_on"] == "yes" ){
// check if within working period
if ( TODAYDATE >= $check_current_datetime && TODAYDATE <= $working_to ){
if ( $attendance_first >= $check_current_datetime && $attendance_first <= $working_to ){
if ( $attendance_first >= $working_from ){
$late++ ;
$this_type = 'late' ;
$last_late = subtractTime( $attendance_first, $working_from ) ;
}else{
$present++ ;
$this_type = 'working' ;
if ( count( $attendance_all ) == 2 || count( $attendance_all ) == 3 ){
$rest_out = $attendance_all[1] ;
$rest_in = ( count( $attendance_all ) == 3 ? $attendance_all[2] : TODAYDATE ) ;
$total_rest = subtractTime( $rest_in, $rest_out ) ;
if ( $total_rest > $working['working_total_rest_hours'] ){
$rest_late++ ;
$this_type = 'rest_late' ;
$last_late = subtractTime( $rest_in, $rest_out ) ;
}
$attendance_first = $attendance ;
}
}
}else{
if ( TODAYDATE >= $working_from ){
$absent++ ;
$this_type = 'absent' ;
$attendance_first = $attendance ;
}
}
}else{
// check absent
if ( $attendance >= $check_current_datetime && $attendance <= $check_next_datetime ){
// check error
if ( $attendance >= $check_current_datetime && $attendance <= $working_to_10 ){
// do nothing
}else{
$error++ ;
$this_type = 'error' ;
}
}else{
if ( TODAYDATE >= $check_current_datetime && TODAYDATE <= $check_next_datetime ){
$absent++ ;
$this_type = 'absent' ;
$attendance_first = $attendance ;
}
}
}
}else{
if ( $attendance >= $working_from && $attendance <= $check_next_datetime ){
$in_off_working++ ;
$this_type = 'off_working' ;
}else{
$in_off++ ;
$this_type = 'off' ;
}
}
}
$temp = [
'staff_id' => $staff['staff_id'],
'staff_image' => PATH . ( $staff['staff_image'] != '' ? 'uploads/Staff/'.$staff['staff_image'] : 'images/NoProduct.jpg' ),
'staff_idno' => $staff['staff_idno'],
'staff_name' => $staff['staff_name'],
'last_late' => ( $last_late != '' ? date( 'H:i', strtotime($last_late) ) : '' ),
'last_attendance' => ( $attendance_first != '' ? $attendance_first : '-' )
] ;
switch ( $this_type ){
case 'working' : $present_list[] = $temp ; break ;
case 'late' : $late_list[] = $temp ; break ;
case 'rest_late' : $rest_late_list[] = $temp ; break ;
case 'absent' : $absent_list[] = $temp ; break ;
case 'off' : $off_list[] = $temp ; break ;
case 'off_working' : $off_working_list[] = $temp ; break ;
case 'mc' : $mc_list[] = $temp ; break ;
case 'leave' : $leave_list[] = $temp ; break ;
case 'error' : $error_list[] = $temp ; break ;
}
}
}
}
}
if ( $is_show == 'manual' ){
$staffs = $mysqli->query( "SELECT a.type, a.times, b.staff_id, b.staff_image, b.staff_idno, b.staff_name FROM staff_attendance_summary a
LEFT JOIN staff b ON ( a.staff_id = b.staff_id )
WHERE a.deleted_at IS NULL AND b.branch_id = '".$array['branch_id']."'" ) ;
if ( $staffs->num_rows > 0 ){
$status = '200' ;
while ( $staff = $staffs->fetch_assoc() ){
$temp = [
'staff_id' => $staff['staff_id'],
'staff_image' => PATH . ( $staff['staff_image'] != '' ? 'uploads/Staff/'.$staff['staff_image'] : 'images/NoProduct.jpg' ),
'staff_idno' => $staff['staff_idno'],
'staff_name' => $staff['staff_name'],
'last_attendance' => $staff['times']
] ;
if ( $staff['type'] == 'late' ){
$late++ ;
$late_list[] = $temp ;
}
if ( $staff['type'] == 'absent' ){
$absent++ ;
$absent_list[] = $temp ;
}
if ( $staff['type'] == 'merit' ){
$merit++ ;
$merit_list[] = $temp ;
}
if ( $staff['type'] == 'passionate' ){
$passionate++ ;
$passionate_list[] = $temp ;
}
}
}
}
$data = [
'staff' => $total_staffs,
'branch_name' => dataFilter( $branch_name ),
'present' => $present,
'present_list' => $present_list,
'late' => ( $late + $rest_late ),
'late_list' => array_merge( $late_list, $rest_late_list ),
'absent' => $absent,
'absent_list' => $absent_list,
'in_off' => $in_off,
'off_list' => $off_list,
'in_mc' => $in_mc,
'mc_list' => $mc_list,
'in_leave' => $in_leave,
'in_off_working' => $in_off_working,
'leave_list' => $leave_list,
'off_working_list' => $off_working_list,
'merit' => $merit,
'merit_list' => $merit_list,
'passionate' => $passionate,
'passionate_list' => $passionate_list
] ;
// }
require( $require_sub.'footer.php' ) ;
?>