159 lines
5.5 KiB
PHP
159 lines
5.5 KiB
PHP
<?php
|
|
|
|
namespace App\Repositories\Admin\Cs;
|
|
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
final class AdminQnaRepository
|
|
{
|
|
public function table(int $year): string
|
|
{
|
|
return "counseling_one_on_one_{$year}";
|
|
}
|
|
|
|
public function hasYearTable(int $year): bool
|
|
{
|
|
return Schema::hasTable($this->table($year));
|
|
}
|
|
|
|
public function paginate(int $year, array $filters, int $perPage): LengthAwarePaginator
|
|
{
|
|
if (!$this->hasYearTable($year)) {
|
|
return new Paginator([], 0, $perPage, 1, [
|
|
'path' => request()->url(),
|
|
'query' => request()->query(),
|
|
]);
|
|
}
|
|
|
|
$t = $this->table($year);
|
|
|
|
$q = DB::table("{$t} as q")
|
|
->select([
|
|
'q.seq','q.state','q.enquiry_code','q.enquiry_title','q.member_num','q.regdate','q.answer_admin_num',
|
|
'q.return_type','q.completion_date',
|
|
])
|
|
->when(($filters['enquiry_code'] ?? '') !== '', fn($w) => $w->where('q.enquiry_code', $filters['enquiry_code']))
|
|
->when(($filters['state'] ?? '') !== '', fn($w) => $w->where('q.state', $filters['state']))
|
|
->when(($filters['my_work'] ?? '') === '1' && (int)($filters['admin_id'] ?? 0) > 0,
|
|
fn($w) => $w->where('q.answer_admin_num', (int)$filters['admin_id'])
|
|
)
|
|
->when(($filters['date_from'] ?? '') !== '', fn($w) => $w->where('q.regdate', '>=', $filters['date_from'].' 00:00:00'))
|
|
->when(($filters['date_to'] ?? '') !== '', fn($w) => $w->where('q.regdate', '<=', $filters['date_to'].' 23:59:59'))
|
|
->orderByDesc('q.seq');
|
|
|
|
// 검색
|
|
$qText = trim((string)($filters['q'] ?? ''));
|
|
$qType = (string)($filters['q_type'] ?? 'title');
|
|
|
|
if ($qText !== '') {
|
|
if ($qType === 'title') {
|
|
$q->where('q.enquiry_title', 'like', "%{$qText}%");
|
|
} elseif ($qType === 'member_no' && ctype_digit($qText)) {
|
|
$q->where('q.member_num', (int)$qText);
|
|
} elseif ($qType === 'member_email') {
|
|
$memNo = $this->findMemberNoByEmail($qText);
|
|
$q->where('q.member_num', $memNo > 0 ? $memNo : -1);
|
|
} elseif ($qType === 'admin_email') {
|
|
$adminId = $this->findAdminIdByEmail($qText);
|
|
$q->where('q.answer_admin_num', $adminId > 0 ? $adminId : -1);
|
|
}
|
|
}
|
|
|
|
return $q->paginate($perPage)->withQueryString();
|
|
}
|
|
|
|
public function findOrFail(int $year, int $seq): object
|
|
{
|
|
if (!$this->hasYearTable($year)) abort(404);
|
|
|
|
$t = $this->table($year);
|
|
|
|
$row = DB::table($t)->where('seq', $seq)->first();
|
|
if (!$row) abort(404);
|
|
return $row;
|
|
}
|
|
|
|
public function lockForUpdate(int $year, int $seq, array $cols = ['*']): object
|
|
{
|
|
if (!$this->hasYearTable($year)) abort(404);
|
|
$t = $this->table($year);
|
|
|
|
$row = DB::table($t)->select($cols)->where('seq', $seq)->lockForUpdate()->first();
|
|
if (!$row) abort(404);
|
|
return $row;
|
|
}
|
|
|
|
public function update(int $year, int $seq, array $data): int
|
|
{
|
|
$t = $this->table($year);
|
|
return DB::table($t)->where('seq', $seq)->update($data);
|
|
}
|
|
|
|
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();
|
|
}
|
|
|
|
public function getDeferCodes(): array
|
|
{
|
|
return DB::table('counseling_code')
|
|
->where('enquiry_type', 'd')
|
|
->orderBy('enquiry_code', 'asc')
|
|
->get(['enquiry_code','enquiry_title'])
|
|
->map(fn($r) => ['code'=>(string)$r->enquiry_code, 'title'=>(string)$r->enquiry_title])
|
|
->all();
|
|
}
|
|
|
|
public function findMemberNoByEmail(string $email): int
|
|
{
|
|
$row = DB::table('mem_info')->where('email', $email)->first(['mem_no']);
|
|
return (int)($row->mem_no ?? 0);
|
|
}
|
|
|
|
public function findAdminIdByEmail(string $email): int
|
|
{
|
|
$row = DB::table('admin_users')->where('email', $email)->first(['id']);
|
|
return (int)($row->id ?? 0);
|
|
}
|
|
|
|
public function getMemberInfo(int $memNo): ?object
|
|
{
|
|
return DB::table('mem_info')->where('mem_no', $memNo)->first(['mem_no','email','name','cell_phone']);
|
|
}
|
|
|
|
public function getRecentOrders(int $memNo, int $limit = 10): array
|
|
{
|
|
// 테이블/컬럼은 네 DB에 맞춰 조정 가능 (CI3 pin_order 기반)
|
|
if (!Schema::hasTable('pin_order')) return [];
|
|
|
|
return DB::table('pin_order')
|
|
->where('mem_no', $memNo)
|
|
->whereIn('stat_pay', ['p','w','c'])
|
|
->orderByDesc('seq')
|
|
->limit($limit)
|
|
->get()
|
|
->all();
|
|
}
|
|
|
|
public function getAdminsByIds(array $ids): array
|
|
{
|
|
$ids = array_values(array_unique(array_filter(array_map('intval', $ids))));
|
|
if (!$ids) return [];
|
|
|
|
return DB::table('admin_users')
|
|
->whereIn('id', $ids)
|
|
->get(['id','email','name'])
|
|
->keyBy('id')
|
|
->map(fn($r) => ['id'=>(int)$r->id,'email'=>(string)$r->email,'name'=>(string)$r->name])
|
|
->all();
|
|
}
|
|
}
|