giftcon_dev/app/Repositories/Admin/Member/AdminMemberRepository.php
2026-02-11 10:43:37 +09:00

183 lines
5.6 KiB
PHP

<?php
namespace App\Repositories\Admin\Member;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
final class AdminMemberRepository
{
public function paginateMembers(array $filters, int $perPage = 30): LengthAwarePaginator
{
$q = DB::table('mem_info as m');
$qf = (string)($filters['qf'] ?? ''); // mem_no|name|email|phone (또는 ''/all)
$keyword = trim((string)($filters['q'] ?? ''));
$phoneEnc = (string)($filters['phone_enc'] ?? '');
if ($keyword !== '') {
$digits = preg_replace('/\D+/', '', $keyword) ?? '';
switch ($qf) {
case 'mem_no':
if ($digits !== '' && ctype_digit($digits)) {
$q->where('m.mem_no', (int)$digits);
} else {
$q->whereRaw('1=0'); // 잘못된 입력이면 결과 없음
}
break;
case 'name':
$q->where('m.name', 'like', "%{$keyword}%");
break;
case 'email':
$q->where('m.email', 'like', "%{$keyword}%");
break;
case 'phone':
if ($phoneEnc !== '') {
$q->where('m.cell_phone', $phoneEnc);
} else {
$q->whereRaw('1=0'); // phone_enc 없으면 매칭 불가
}
break;
default:
// qf가 없거나(all)일 때: 기존 통합 검색 + phone_enc 있으면 OR로 포함
$q->where(function ($w) use ($keyword, $digits, $phoneEnc) {
if ($digits !== '' && ctype_digit($digits)) {
$w->orWhere('m.mem_no', (int)$digits);
}
$w->orWhere('m.name', 'like', "%{$keyword}%")
->orWhere('m.email', 'like', "%{$keyword}%");
if ($phoneEnc !== '') {
$w->orWhere('m.cell_phone', $phoneEnc);
}
});
break;
}
}
// stat_3
$stat3 = (string)($filters['stat_3'] ?? '');
if ($stat3 !== '') {
$q->where('m.stat_3', $stat3);
}
// date range
$dateFrom = trim((string)($filters['date_from'] ?? ''));
if ($dateFrom !== '') {
$q->where('m.dt_reg', '>=', $dateFrom.' 00:00:00');
}
$dateTo = trim((string)($filters['date_to'] ?? ''));
if ($dateTo !== '') {
$q->where('m.dt_reg', '<=', $dateTo.' 23:59:59');
}
$q->orderByDesc('m.mem_no');
return $q->select([
'm.mem_no',
'm.stat_1','m.stat_2','m.stat_3','m.stat_4','m.stat_5',
'm.name','m.birth','m.gender','m.native',
'm.cell_corp','m.cell_phone','m.email',
'm.login_fail_cnt',
'm.dt_login','m.dt_reg','m.dt_mod',
])->paginate($perPage)->withQueryString();
}
public function findMember(int $memNo): ?object
{
return DB::table('mem_info')->where('mem_no', $memNo)->first();
}
public function lockMemberForUpdate(int $memNo): ?object
{
return DB::table('mem_info')->where('mem_no', $memNo)->lockForUpdate()->first();
}
public function updateMember(int $memNo, array $data): bool
{
$data['dt_mod'] = $data['dt_mod'] ?? now()->format('Y-m-d H:i:s');
return DB::table('mem_info')->where('mem_no', $memNo)->update($data) > 0;
}
public function getAuthRowsForMember(int $memNo): array
{
return DB::table('mem_auth')
->where('mem_no', $memNo)
->orderBy('auth_type')
->get()
->map(fn($r)=>(array)$r)
->all();
}
public function getAuthMapForMembers(array $memNos): array
{
if (empty($memNos)) return [];
$rows = DB::table('mem_auth')
->whereIn('mem_no', $memNos)
->get(['mem_no','auth_type','auth_state','auth_date']);
$map = [];
foreach ($rows as $r) {
$no = (int)$r->mem_no;
$map[$no] ??= [];
$map[$no][(string)$r->auth_type] = [
'state' => (string)$r->auth_state,
'date' => (string)$r->auth_date,
];
}
return $map;
}
public function getAuthInfo(int $memNo): ?array
{
$row = DB::table('mem_auth_info')->where('mem_no', $memNo)->first();
if (!$row) return null;
$json = (string)($row->auth_info ?? '');
$arr = json_decode($json, true);
return is_array($arr) ? $arr : null;
}
public function getAuthLogs(int $memNo, int $limit = 30): array
{
return DB::table('mem_auth_log')
->where('mem_no', $memNo)
->orderByDesc('seq')
->limit($limit)
->get()
->map(fn($r)=>(array)$r)
->all();
}
public function getAddresses(int $memNo): array
{
return DB::table('mem_address')
->where('mem_no', $memNo)
->orderByDesc('seq')
->get()
->map(fn($r)=>(array)$r)
->all();
}
public function anonymizeAddresses(int $memNo): void
{
DB::table('mem_address')
->where('mem_no', $memNo)
->update([
'shipping' => '',
'zipNo' => '',
'roadAddrPart1' => '',
'jibunAddr' => '',
'addrDetail' => '',
]);
}
}