query("CALL proc_get_code2_list('CO100')"); $corp_list = $stmt_corp->fetchAll(PDO::FETCH_ASSOC); while ($stmt_corp->nextRowset()) { } unset($stmt_corp); } catch (Exception $eProc) { $corp_list = []; } // 권한에 따른 법인 목록 제어 // LE10001: 전체권한 → 전체 법인 표시 (corp_list 그대로) // LE10002: 법인권한 → 본인 법인($sys_comp_code)만 표시, 검색값도 고정 // 그 외: 법인 목록 없음 // 법인 초기값은 로그인한 사용자의 법인으로 설정 $message_name = $pdo->prepare("SELECT DESC01 FROM edu_codes WHERE base_code = 'AL100100'"); $message_name->execute(); $message_name = $message_name->fetchColumn(); if ($auth_level === 'LE10002') { // 본인 법인만 필터링 $corp_list = array_filter($corp_list, fn($c) => $c['code'] === $sys_comp_code); $corp_list = array_values($corp_list); // 검색 법인도 강제 고정 $search_comp = $sys_comp_code; } elseif ($auth_level !== 'LE10001') { // 그 외 권한: 법인 목록 비움 $corp_list = []; } // 2. 전체 대상자 수 로그인한 법인과 소속회사가 같은 기준으로 계산, 퇴사자 제외 $stmt_all = $pdo->prepare("SELECT COUNT(DISTINCT member_id) FROM edu_users WHERE (end_date IS NULL OR (end_date > '1000-01-01' AND YEAR(end_date) >= ?)) AND (? = '' OR belong_comp = ?) and sys_comp_code = belong_comp"); $stmt_all->execute([$search_year, $search_comp, $search_comp]); $all_user_qty = (int) $stmt_all->fetchColumn(); // 3. 미수료 인원 $stmt_incomp = $pdo->prepare("SELECT COUNT(DISTINCT u.member_id) FROM edu_users u WHERE (u.end_date IS NULL OR (u.end_date > '1000-01-01' AND YEAR(u.end_date) >= ?)) AND (? = '' OR u.belong_comp = ?) AND sys_comp_code = belong_comp AND fn_get_progress_rate(u.sys_comp_code,?,u.member_id,'CA10003','') != 100"); $stmt_incomp->execute([$search_year, $search_comp, $search_comp, $search_year]); $incomplete_qty = (int) $stmt_incomp->fetchColumn(); $completed_qty = max(0, $all_user_qty - $incomplete_qty); // 4. G1 메인 쿼리 (? 위치 파라미터 사용으로 재사용 문제 없음) $sql_inner = "SELECT a.sys_comp_code, a.belong_comp , (SELECT code_name FROM edu_codes c WHERE c.group_code = 'CO100' AND c.code = a.belong_comp LIMIT 1) AS comp_name , a.name, a.member_id , a.dept_name , IFNULL(b.formatted_tm, '00시간 00분') AS all_tm , CASE WHEN a.member_id IN ( SELECT u2.member_id FROM edu_users u2 WHERE NOT EXISTS ( SELECT 1 FROM edu_contents c2 WHERE c2.category_code = 'CA10003' AND c2.base_year = ? AND c2.is_active = '1' AND NOT EXISTS (SELECT 1 FROM edu_learning_histories h2 WHERE h2.content_id = c2.content_id AND h2.member_id = u2.member_id AND h2.sys_comp_code = u2.sys_comp_code AND h2.completed_at IS NOT NULL AND h2.completed_at != '') ) ) THEN '수료' ELSE '미수료' END AS completion_status , fn_get_progress_rate(a.sys_comp_code, ?, a.member_id, 'CA10003', '') AS progress_rate -- 진행율 , fn_get_completion_date(a.sys_comp_code, ?, a.member_id, 'CA10003', '') AS completion_date -- 학습완료일 FROM edu_users a LEFT JOIN ( SELECT t.sys_comp_code, t.member_id, CONCAT( LPAD(FLOOR(SUM(t.calc_tm)/3600), 2, '0'), '시간 ', LPAD(FLOOR((SUM(t.calc_tm)%3600)/60), 2, '0'), '분' ) AS formatted_tm FROM ( SELECT z.sys_comp_code, x.member_id, CASE WHEN x.completed_at IS NOT NULL AND x.completed_at <> '' THEN x.content_tm ELSE x.watch_tm END AS calc_tm FROM edu_learning_histories x JOIN edu_contents y ON x.content_id = y.content_id JOIN edu_users z ON x.sys_comp_code = z.working_comp AND x.member_id = z.member_id WHERE y.category_code = 'CA10003' AND YEAR(x.first_viewed_at) = ? ) t GROUP BY t.sys_comp_code, t.member_id ) b ON a.member_id = b.member_id AND a.sys_comp_code = b.sys_comp_code WHERE (a.end_date IS NULL OR a.end_date = '' OR (a.end_date > '1000-01-01' AND YEAR(a.end_date) >= ?)) and a.sys_comp_code = a.belong_comp AND (? = '' OR a.belong_comp = ?) AND a.dept_name LIKE CONCAT('%', ?, '%') AND a.name LIKE CONCAT('%', ?, '%')"; if ($search_comp_status === 'Y') { $sql = "SELECT * FROM ($sql_inner) t WHERE completion_status = '수료'"; } elseif ($search_comp_status === 'N') { $sql = "SELECT * FROM ($sql_inner) t WHERE completion_status = '미수료'"; } else { $sql = "SELECT * FROM ($sql_inner) t"; } $stmt_g1 = $pdo->prepare($sql); // ? 순서: 1=completion_status(base_year), 2=progress_rate(year), 3=completion_date(year), 4=LEFT JOIN(first_viewed_at), 5=WHERE(end_date), 6=belong_comp 체크, 7=belong_comp 필터, 8=dept_name, 9=name $stmt_g1->execute([$search_year, $search_year, $search_year, $search_year, $search_year, $search_comp, $search_comp, $search_dept, $search_name]); $rows = $stmt_g1->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) { $db_error = $e->getMessage(); } ?>

법정의무교육

전체 대상자

수료 완료

미수료

NO 소속법인 성명 사번 부서 학습시간 진도율 교육이수일 수료구분
데이터가 없습니다.
%
수료 미수료