0 ? $year : (int) date('Y'); $table = "counseling_one_on_one_{$year}"; if (!Schema::hasTable($table)) { return new Paginator([], 0, $perPage, 1, [ 'path' => request()->url(), 'query' => request()->query(), ]); } return CounselingOneOnOne::queryForYear($year) ->from("{$table} as q") ->leftJoin('counseling_code as cc', function ($join) { $join->on('cc.enquiry_code', '=', 'q.enquiry_code') ->where('cc.enquiry_type', '=', 'e'); // ✅ 접수분류 타입 }) ->where('q.member_num', $memNo) ->select([ 'q.seq', 'q.state', 'q.enquiry_code', 'q.enquiry_title', 'q.regdate', // ✅ 코드 대신 보여줄 분류명 'cc.enquiry_title as enquiry_code_name', ]) ->orderByDesc('q.seq') ->paginate($perPage) ->withQueryString(); } public function findMyQna(int $memNo, int $seq, int $year = 0) { $year = $year > 0 ? $year : (int) date('Y'); $table = "counseling_one_on_one_{$year}"; if (!Schema::hasTable($table)) { abort(404); } return CounselingOneOnOne::queryForYear($year) ->from("{$table} as q") ->leftJoin('counseling_code as cc', function ($join) { $join->on('cc.enquiry_code', '=', 'q.enquiry_code') ->where('cc.enquiry_type', '=', 'e'); }) ->where('q.member_num', $memNo) ->where('q.seq', $seq) ->select([ 'q.seq', 'q.state', 'q.enquiry_code', 'q.enquiry_title', 'q.enquiry_content', 'q.answer_content', 'q.regdate', 'cc.enquiry_title as enquiry_code_name', ]) ->firstOrFail(); } public function getEnquiryCodes(): array { return DB::table('counseling_code') ->where('enquiry_type', 'e') ->orderBy('enquiry_code', 'asc') ->get(['enquiry_code', 'enquiry_title']) ->map(fn($r) => ['code' => (string)$r->enquiry_code, 'title' => (string)$r->enquiry_title]) ->all(); } /** * 1:1 문의 등록 (연도 테이블: counseling_one_on_one_YYYY) * 반환: insert seq(id) */ public function createQna(int $memNo, array $payload, ?int $year = null): int { $year = $year ?: (int)date('Y'); $table = "counseling_one_on_one_{$year}"; // 테이블이 없으면(혹시 모를 경우) 생성은 다음 단계로. 지금은 실패 처리 if (!Schema::hasTable($table)) { throw new \RuntimeException("qna_table_not_found: {$table}"); } $enquiryCode = (string)($payload['enquiry_code'] ?? ''); $enquiryTitle = strip_tags(trim((string)($payload['enquiry_title'] ?? ''))); $enquiryContent = strip_tags(trim((string)($payload['enquiry_content'] ?? ''))); $returnType = (string)($payload['return_type'] ?? 'web'); $id = (int) DB::transaction(function () use ($table, $memNo, $enquiryCode, $enquiryTitle, $enquiryContent, $returnType) { return DB::table($table)->insertGetId([ 'state' => 'a', 'member_num' => $memNo, 'enquiry_code' => $enquiryCode, 'enquiry_title' => $enquiryTitle, 'enquiry_content' => $enquiryContent, 'return_type' => $returnType, 'user_upload' => null, 'regdate' => now()->format('Y-m-d H:i:s'), 'receipt_date' => "1900-01-01 00:00:00", 'defer_date' => "1900-01-01 00:00:00", 'completion_date' => "1900-01-01 00:00:00", ]); }); $userEmail = (string)($payload['_user_email'] ?? ''); $userName = (string)($payload['_user_name'] ?? ''); $ip = (string)($payload['_ip'] ?? ''); $cellEnc = (string)($payload['_user_cell_enc'] ?? ''); $seed = app(CiSeedCrypto::class); $cellPlain = (string) $seed->decrypt($cellEnc); SendAdminQnaCreatedMailJob::dispatch($memNo, $id, [ 'name' => $userName, 'email' => $userEmail, 'cell' => $cellPlain, 'ip' => $ip, 'year' => $year, 'enquiry_code' => $enquiryCode, 'enquiry_title' => $enquiryTitle, 'enquiry_content' => $enquiryContent, 'return_type' => $returnType, 'created_at' => now()->toDateTimeString(), ])->onConnection('redis'); // 네 QUEUE_CONNECTION=redis일 때 명시해도 좋음 return $id; } }