'제안', 'OF10002' => '검토중', 'OF10003' => '게시완료', 'OF10004' => '게시불가', ]; $offerHistory = []; try { $pdo = db_conn(); $pdo->exec("SET NAMES 'utf8mb4'"); // 상태 코드맵 동적 조회 (기본값 fallback 유지) $stmtCode = $pdo->prepare(" SELECT base_code, code_name FROM edu_codes WHERE group_code = 'OF100' AND is_active = '1' ORDER BY code "); $stmtCode->execute(); foreach ($stmtCode->fetchAll(PDO::FETCH_ASSOC) as $codeRow) { $offerStatusMap[$codeRow['base_code']] = $codeRow['code_name']; } // 제안 이력 조회 // 정렬 우선순위: // 1) 검토중(OF10002) 최상단 // 2) 그 외 상태는 코드 우선순위대로 // 3) 같은 상태 안에서는 최신순 $stmt = $pdo->prepare(" SELECT co.offer_id, co.type_code, co.title, co.reference_url, co.reason, co.status_code, co.created_at, co.updated_at FROM edu_content_offer co WHERE co.member_id = :member_id AND co.sys_comp_code = :sys_comp_code ORDER BY CASE co.status_code WHEN 'OF10002' THEN 0 -- 검토중 WHEN 'OF10001' THEN 1 -- 제안 WHEN 'OF10003' THEN 2 -- 게시완료 WHEN 'OF10004' THEN 3 -- 게시불가 ELSE 9 END, co.created_at DESC, co.offer_id DESC LIMIT 20 "); $stmt->execute([ ':member_id' => $memberId, ':sys_comp_code' => $sysCompCode, ]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { $statusCode = trim((string)($row['status_code'] ?? '')); $offerHistory[] = [ 'offer_id' => $row['offer_id'] ?? '', 'type_code' => $row['type_code'] ?? '', 'title' => $row['title'] ?? '', 'reference_url' => $row['reference_url'] ?? '', 'reason' => $row['reason'] ?? '', 'status_code' => $statusCode, 'status_name' => $offerStatusMap[$statusCode] ?? $statusCode, 'created_at' => $row['created_at'] ?? '', 'updated_at' => $row['updated_at'] ?? '', 'created_at_dot' => !empty($row['created_at']) ? date('y.m.d', strtotime($row['created_at'])) : '', 'is_consider' => ($statusCode === 'OF10002'), ]; } } catch (Throwable $e) { // 운영 시 로깅 권장 // error_log($e->getMessage()); }