[ 'label' => 'Master', 'class' => 'master', 'icon' => '/img/ico/ico_level_master.svg', ], 'ELITE' => [ 'label' => 'Elite', 'class' => 'elite', 'icon' => '/img/ico/ico_level_elite.svg', ], 'LEARNER' => [ 'label' => 'Learner', 'class' => 'learner', 'icon' => '/img/ico/ico_level_learner.svg', ], 'ROOKIE' => [ 'label' => 'Rookie', 'class' => 'rookie', 'icon' => '/img/ico/ico_level_rookie.svg', ], ]; $key = strtoupper($level); return $map[$key] ?? [ 'label' => 'Rookie', 'class' => 'rookie', 'icon' => '/img/ico/ico_level_rookie.svg', ]; } /** * 총 학습시간 기준으로 학습레벨 계산 * - 40시간 이상: Master * - 20 ~ 40시간: Elite * - 8 ~ 20시간: Learner * - 0 ~ 8시간: Rookie */ function calc_level_by_minutes(int $totalMinutes): string { if ($totalMinutes >= 2400) { return 'MASTER'; } if ($totalMinutes >= 1200) { return 'ELITE'; } if ($totalMinutes >= 480) { return 'LEARNER'; } return 'ROOKIE'; } try { $pdo = db_conn(); $pdo->exec("SET NAMES 'utf8mb4'"); // ★ 선택년도 수집 $selectedYear = trim((string)($_GET['selected_year'] ?? date('Y'))); if ($selectedYear === '' || !preg_match('/^\d{4}$/', $selectedYear)) { $selectedYear = date('Y'); } $levelCode = 'ROOKIE'; $totalMinutes = 0; $statsYear = $selectedYear; // ★ 선택년도 통계 우선 조회 $stmt = $pdo->prepare(" SELECT stats_year, learning_level, total_minutes FROM edu_yearly_learning_stats WHERE member_id = :member_id AND sys_comp_code = :sys_comp_code AND stats_year = :selected_year LIMIT 1 "); $stmt->execute([ ':member_id' => $memberId, ':sys_comp_code' => $sysCompCode, ':selected_year' => (int)$selectedYear, ]); $row = $stmt->fetch(PDO::FETCH_ASSOC); if ($row) { $levelCode = (string)($row['learning_level'] ?? 'ROOKIE'); $totalMinutes = (int)($row['total_minutes'] ?? 0); $statsYear = (string)($row['stats_year'] ?? $selectedYear); } else { // ★ 선택년도 통계가 없으면 학습이력 합계로 fallback $stmtFallback = $pdo->prepare(" SELECT COALESCE(SUM(watch_tm), 0) AS total_minutes FROM edu_learning_histories WHERE member_id = :member_id AND sys_comp_code = :sys_comp_code AND YEAR(last_viewed_at) = :selected_year "); $stmtFallback->execute([ ':member_id' => $memberId, ':sys_comp_code' => $sysCompCode, ':selected_year' => (int)$selectedYear, ]); $totalMinutes = (int)$stmtFallback->fetchColumn(); $totalMinutes = floor($totalMinutes / 60);//초를 분으로 $levelCode = calc_level_by_minutes($totalMinutes); } $levelMeta = mypage_level_meta($levelCode); response_json([ 'success' => true, 'selected_year' => $selectedYear, 'stats_year' => $statsYear, 'total_minutes' => $totalMinutes, 'learning_level' => $levelMeta['label'], 'level_class' => $levelMeta['class'], 'level_icon' => $levelMeta['icon'], ]); } catch (Throwable $e) { response_json([ 'success' => false, 'message' => '학습레벨 정보를 불러오지 못했습니다.', 'error' => $e->getMessage(), ]); }