Files
edu/admin/bbs/legal_edu_excel.php
T

130 lines
6.3 KiB
PHP

<?php
require_once __DIR__ . '/../../bbs/db_conn.php';
$search_comp = $_GET['comp'] ?? '';
$search_year = $_GET['year'] ?? date('Y');
$search_dept = $_GET['dept'] ?? '';
$search_name = $_GET['name'] ?? '';
$search_comp_status = $_GET['comp_status'] ?? '';
try {
$pdo = db_conn();
// 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 x.sys_comp_code, x.member_id,
// CONCAT(LPAD(FLOOR(SUM(CASE WHEN x.completed_at IS NOT NULL AND x.completed_at <> '' THEN x.content_tm ELSE x.watch_tm END)/3600),2,'0'),'시간 ',
// LPAD(FLOOR((SUM(CASE WHEN x.completed_at IS NOT NULL AND x.completed_at <> '' THEN x.content_tm ELSE x.watch_tm END)%3600)/60),2,'0'),'분') AS formatted_tm
// FROM edu_learning_histories x JOIN edu_contents y ON x.content_id = y.content_id
// WHERE y.category_code = 'CA10003' AND YEAR(x.first_viewed_at) = ?
// GROUP BY x.sys_comp_code, x.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 (? = '' OR a.belong_comp = ?)
// AND a.dept_name LIKE CONCAT('%', ?, '%')
// AND a.name LIKE CONCAT('%', ?, '%')";
$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 z.sys_comp_code, x.member_id,
CONCAT(LPAD(FLOOR(SUM(CASE WHEN x.completed_at IS NOT NULL AND x.completed_at <> '' THEN x.content_tm ELSE x.watch_tm END)/3600),2,'0'),'시간 ',
LPAD(FLOOR((SUM(CASE WHEN x.completed_at IS NOT NULL AND x.completed_at <> '' THEN x.content_tm ELSE x.watch_tm END)%3600)/60),2,'0'),'분') AS formatted_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) = ?
GROUP BY x.sys_comp_code, x.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 = $pdo->prepare($sql);
$stmt->execute([$search_year, $search_year, $search_year, $search_year, $search_year, $search_comp, $search_comp, $search_dept, $search_name]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
die("DB Error");
}
header("Content-Type: application/vnd.ms-excel; charset=utf-8");
header("Content-Disposition: attachment; filename=legal_edu_result_" . date('Ymd') . ".xls");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body>';
echo '<table border="1">';
echo '<thead><tr>';
echo '<th>NO</th>';
echo '<th>소속법인</th>';
echo '<th>성명</th>';
echo '<th>사번</th>';
echo '<th>부서</th>';
echo '<th>학습시간</th>';
echo '<th>진도율</th>';
echo '<th>교육이수일</th>';
echo '<th>수료구분</th>';
echo '</tr></thead>';
echo '<tbody>';
$idx = 1;
foreach ($rows as $row) {
echo '<tr>';
echo '<td>' . $idx++ . '</td>';
echo '<td>' . htmlspecialchars($row['comp_name'] ?? '') . '</td>';
echo '<td>' . htmlspecialchars($row['name'] ?? '') . '</td>';
echo '<td>' . htmlspecialchars($row['member_id'] ?? '') . '</td>';
echo '<td>' . htmlspecialchars($row['dept_name'] ?? '') . '</td>';
echo '<td>' . htmlspecialchars($row['all_tm'] ?? '') . '</td>';
// 진행율 처리
$progress = $row['progress_rate'] ?? '0%';
$progress_value = is_numeric($progress) ? (int) $progress : (int) preg_replace('/[^0-9]/', '', $progress);
echo '<td>' . $progress_value . '%</td>';
echo '<td>' . htmlspecialchars($row['completion_date'] ?? '-') . '</td>';
echo '<td>' . htmlspecialchars($row['completion_status']) . '</td>';
echo '</tr>';
}
echo '</tbody></table></body></html>';