Files
edu/lib/myclass_db_helper.php

265 lines
9.7 KiB
PHP

<?php
/**
* myclass_db_helper.php
* DB 데이터 연동 헬퍼 함수 모음
* - 사용자 정보 조회
* - 학습 목표 조회
* - 년도/분기/남은일수 계산
*/
// ========== 년도/분기/남은일수 계산 함수 ==========
/**
* 현재 분기 및 목표 날짜 정보 계산
* @return array ['year' => 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
<div class="page-title">
<h3>2026년도 {$quarterInfo['quarter_num']}분기의 첫번째 목표를 완성했어요!</h3>
<p><em>다음 목표를 선택</em>해, 나만의 책장을 더 풍성하게 채워보세요.</p>
</div>
HTML;
}
if ($mode === 'additional') {
$goal_title = isset($completedGoal['title']) ? htmlspecialchars($completedGoal['title'], ENT_QUOTES, 'UTF-8') : '목표';
return <<<HTML
<div class="page-title">
<h3><em>축하합니다.</em> <strong>[$goal_title]</strong>, 빛나는 책장을 완성했어요.</h3>
<p><em>다음 책장</em>을 열어볼까요?</p>
</div>
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 <<<HTML
<div class="page-title page-title--goal" data-state="initial">
<h3><em>{$user_name} {$user_position}</em>님, <strong>{$year_kr}년도 {$quarterInfo['quarter_num']}분기 학습 목표</strong>를 골라볼까요?</h3>
<p class="page-title-deadline"><span class="deadline-highlight">{$days_display}<small>({$target_date})</small></span><span class="deadline-body">까지 <strong>선택한 목표</strong>와 함께 배움을 채워가세요.</span></p>
</div>
HTML;
}