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 = [];
}
// 1-2. 교육과정별 수료증 출력을 위한 과정 목록 조회
$course_list = [];
try {
$stmt_courses = $pdo->query("SELECT base_code AS code, code_name FROM edu_codes WHERE group_code='CA200' AND desc01 = 'CA10003' ORDER BY base_code;");
$course_list = $stmt_courses->fetchAll(PDO::FETCH_ASSOC);
while ($stmt_courses->nextRowset()) {
}
unset($stmt_courses);
} catch (Exception $eCourses) {
$course_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 > '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();
}
?>