2026, 'quarter' => '1분기', 'quarter_num' => 1, 'target_date' => '2026-03-31', 'target_date_kr' => '3월 31일', 'days_remaining' => 12] */ function getQuarterInfo() { $today = new DateTime('now', new DateTimeZone('Asia/Seoul')); $year = (int) $today->format('Y'); $month = (int) $today->format('m'); // 분기 결정 $quarter_num = ceil($month / 3); $quarter_text = $quarter_num . '분기'; // 각 분기의 마지막 날짜 $quarter_end_dates = [ 1 => '03-31', // 1분기: 3월 31일 2 => '06-30', // 2분기: 6월 30일 3 => '09-30', // 3분기: 9월 30일 4 => '12-31', // 4분기: 12월 31일 ]; $target_date_str = $year . '-' . $quarter_end_dates[$quarter_num]; $target_date = new DateTime($target_date_str, new DateTimeZone('Asia/Seoul')); // 남은 일수 계산 $interval = $today->diff($target_date); $days_remaining = max(0, (int) $interval->format('%a')); // 한글 날짜 (월월일일 형식) $month_kr = (int) explode('-', $quarter_end_dates[$quarter_num])[0]; $day_kr = (int) explode('-', $quarter_end_dates[$quarter_num])[1]; $target_date_kr = $month_kr . '월 ' . $day_kr . '일'; return [ 'year' => $year, 'quarter_num' => $quarter_num, 'quarter_text' => $quarter_text, 'target_date' => $target_date_str, 'target_date_kr' => $target_date_kr, 'days_remaining' => $days_remaining, 'days_display' => 'D-' . $days_remaining, ]; } // ========== 사용자 정보 조회 함수 ========== /** * 세션에서 사용자 정보 조회 * 실제 DB 연결 후 필요에 따라 DB 조회로 변경 가능 * @return array ['id' => 1, 'name' => '홍길동', 'position' => '선임연구원', 'company' => '한맥기술'] */ function getUserInfo() { // TODO: 실제 DB 연결 시 아래 함수 사용 // return getUserInfoFromDB($_SESSION['user_id'] ?? null); // 현재는 세션 정보 기반 반환 if (isset($_SESSION['user_name']) && isset($_SESSION['user_position'])) { return [ 'id' => $_SESSION['user_id'] ?? 1, 'name' => $_SESSION['user_name'] ?? '사용자', 'position' => $_SESSION['user_position'] ?? '사원', 'company' => $_SESSION['user_company'] ?? '회사명', 'rank' => $_SESSION['user_rank'] ?? 1250, ]; } // 기본값 (테스트용) return [ 'id' => 1, 'name' => '홍길동', 'position' => '선임연구원', 'company' => '한맥기술', 'rank' => 1250, ]; } /** * DB에서 사용자 정보 조회 (DB 연결 후 사용) * @param int $user_id * @return array|null */ function getUserInfoFromDB($user_id) { global $mysqli; // DB 연결 객체 필요 if (!$user_id) return null; // TODO: 실제 테이블명과 필드명으로 수정 $query = "SELECT id, name, position, company, rank FROM users WHERE id = ? LIMIT 1"; if ($stmt = $mysqli->prepare($query)) { $stmt->bind_param('i', $user_id); $stmt->execute(); $result = $stmt->get_result(); $user = $result->fetch_assoc(); $stmt->close(); return $user; } return null; } // ========== 학습 목표 조회 함수 ========== /** * 모든 학습 목표 조회 * @return array */ function getLearningGoals() { // 기본 목표 배열 (현재 코드에서 사용하는 것과 동일) return [ ['id' => 1, 'title' => '자기이해와 강점 찾기', 'desc' => '나의 성향, 가치관, 강점 등을 탐색하고 이해하며 자기인식을 높이는 과정', 'icon' => 'target', 'gif' => 'ico_target.gif', 'json' => 'ico_target.json'], ['id' => 2, 'title' => '효과적인\n의사소통 배우기', 'desc' => '상황에 맞는 말하기와 경청을 통해 타인과 원활하게 소통하는 방법을 익히는 과정', 'icon' => 'email', 'gif' => 'ico_email.gif', 'json' => 'ico_email.json'], ['id' => 3, 'title' => '감정 조절과 자기관리', 'desc' => '다양한 감정을 인식하고 조절하여 안정적인 삶을 유지하는 자기관리 훈련 과정', 'icon' => 'emoji', 'gif' => 'ico_emoji.gif', 'json' => 'ico_emoji.json'], ['id' => 4, 'title' => '비판적 사고와 문제 해결', 'desc' => '다양한 관점에서 생각하고 문제 상황을 논리적으로 해결하는 능력을 기르는 과정', 'icon' => 'lightbulb', 'gif' => 'ico_lightbulb.gif', 'json' => 'ico_lightbulb.json'], ['id' => 5, 'title' => '협업과 팀워크 기르기', 'desc' => '타인과 협력하며 공동의 목표를 위해 함께 노력하는 태도와 기술을 기르는 과정', 'icon' => 'puzzle', 'gif' => 'ico_puzzle.gif', 'json' => 'ico_puzzle.json'], ['id' => 6, 'title' => '커리어 탐색과 역량 개발', 'desc' => '직무와 산업의 흐름을 이해하고, 자신의 커리어 방향성과 필요한 역량을 점검·계획하는 과정', 'icon' => 'target', 'gif' => 'ico_target.gif', 'json' => 'ico_target.json'], ]; } /** * DB에서 학습 목표 조회 (DB 연결 후 사용) * @return array */ function getLearningGoalsFromDB() { global $mysqli; // DB 연결 객체 필요 // TODO: 실제 테이블명으로 수정 (예: edu_learning_goals) $query = "SELECT id, title, description as desc, icon, gif_filename as gif, json_filename as json FROM edu_learning_goals ORDER BY id ASC"; $result = $mysqli->query($query); if (!$result) return []; $goals = []; while ($row = $result->fetch_assoc()) { $goals[] = $row; } return $goals; } /** * 사용자의 선택된 학습 목표 조회 * @param int $user_id * @param int $year * @param int $quarter * @return array|null ['goal_id' => 1, 'selected_at' => '2026-01-15', 'completion_status' => 'in_progress'] */ function getUserSelectedGoal($user_id, $year, $quarter) { global $mysqli; // DB 연결 객체 필요 // TODO: 실제 테이블명으로 수정 (예: edu_user_learning_progress) $query = "SELECT goal_id, selected_at, completion_status FROM edu_user_learning_progress WHERE user_id = ? AND year = ? AND quarter = ? LIMIT 1"; if ($stmt = $mysqli->prepare($query)) { $stmt->bind_param('iii', $user_id, $year, $quarter); $stmt->execute(); $result = $stmt->get_result(); $goal = $result->fetch_assoc(); $stmt->close(); return $goal; } return null; } /** * 사용자의 완료된 목표 내역 조회 * @param int $user_id * @return array []id => 1, 2, 3] */ function getCompletedGoals($user_id) { global $mysqli; // DB 연결 객체 필요 // TODO: 실제 테이블명으로 수정 $query = "SELECT goal_id FROM edu_user_learning_progress WHERE user_id = ? AND completion_status = 'completed' ORDER BY completed_at DESC"; $completed = []; if ($stmt = $mysqli->prepare($query)) { $stmt->bind_param('i', $user_id); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { $completed[] = (int) $row['goal_id']; } $stmt->close(); } return $completed; } // ========== 유틸리티 함수 ========== /** * 순위 정보 조회 (더미 데이터) * @return array */ function getRankingList() { // TODO: DB에서 실제 순위 데이터 조회 return [ ['rank' => 1, 'medal' => 'gold', 'name' => '박길동', 'company' => '바론컨설턴트'], ['rank' => 2, 'medal' => 'silver', 'name' => '홍길동', 'company' => '한맥기술'], ['rank' => 3, 'medal' => 'bronze', 'name' => '김철수', 'company' => '삼안'], ['rank' => 4, 'medal' => 'none', 'name' => '박철수', 'company' => '바른컨설턴트'], ['rank' => 5, 'medal' => 'none', 'name' => '김영희', 'company' => '한맥기술'], ]; } /** * 안내 문구 생성 * @param string $mode (initial, completed, additional) * @param array $user * @param array $quarterInfo * @param array $completedGoal * @return string HTML */ function generatePageIntro($mode, $user, $quarterInfo, $completedGoal = null) { $year_kr = substr($quarterInfo['year'], 2); // 26 if ($mode === 'completed') { return <<
다음 목표를 선택해, 나만의 책장을 더 풍성하게 채워보세요.
HTML; } if ($mode === 'additional') { $goal_title = isset($completedGoal['title']) ? htmlspecialchars($completedGoal['title'], ENT_QUOTES, 'UTF-8') : '목표'; return <<다음 책장을 열어볼까요?
HTML; } // 초기 상태 (목표 선택) $user_name = htmlspecialchars($user['name'] ?? '사용자', ENT_QUOTES, 'UTF-8'); $user_position = htmlspecialchars($user['position'] ?? '', ENT_QUOTES, 'UTF-8'); $days_display = $quarterInfo['days_display']; $target_date = $quarterInfo['target_date_kr']; return <<{$days_display}({$target_date})까지 선택한 목표와 함께 배움을 채워가세요.
HTML; }