- ArchivedRecord, ArchivedRecordRelation 모델 추가 - ArchivedRecordService 추가 (읽기 전용) - 목록/상세 컨트롤러 및 뷰 구현 - HTMX 기반 테이블 필터링 및 페이지네이션 - 사이드바 메뉴 연결
99 lines
3.0 KiB
PHP
99 lines
3.0 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Archives\ArchivedRecord;
|
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
|
|
|
class ArchivedRecordService
|
|
{
|
|
/**
|
|
* 아카이브 레코드 목록 조회 (페이지네이션)
|
|
*/
|
|
public function getArchivedRecords(array $filters = [], int $perPage = 15): LengthAwarePaginator
|
|
{
|
|
$query = ArchivedRecord::query()
|
|
->with(['deletedByUser', 'relations'])
|
|
->withCount('relations');
|
|
|
|
// 레코드 타입 필터
|
|
if (! empty($filters['record_type'])) {
|
|
$query->where('record_type', $filters['record_type']);
|
|
}
|
|
|
|
// 삭제자 필터
|
|
if (! empty($filters['deleted_by'])) {
|
|
$query->where('deleted_by', $filters['deleted_by']);
|
|
}
|
|
|
|
// 노트 유무 필터
|
|
if (isset($filters['has_notes'])) {
|
|
if ($filters['has_notes'] === 'yes' || $filters['has_notes'] === '1') {
|
|
$query->whereNotNull('notes')->where('notes', '!=', '');
|
|
} elseif ($filters['has_notes'] === 'no' || $filters['has_notes'] === '0') {
|
|
$query->where(function ($q) {
|
|
$q->whereNull('notes')->orWhere('notes', '');
|
|
});
|
|
}
|
|
}
|
|
|
|
// 검색
|
|
if (! empty($filters['search'])) {
|
|
$search = $filters['search'];
|
|
$query->where(function ($q) use ($search) {
|
|
$q->where('record_type', 'like', "%{$search}%")
|
|
->orWhere('notes', 'like', "%{$search}%")
|
|
->orWhereRaw("JSON_EXTRACT(main_data, '$.name') LIKE ?", ["%{$search}%"])
|
|
->orWhereRaw("JSON_EXTRACT(main_data, '$.title') LIKE ?", ["%{$search}%"]);
|
|
});
|
|
}
|
|
|
|
// 정렬 (기본: 삭제일시 내림차순)
|
|
$sortBy = $filters['sort_by'] ?? 'deleted_at';
|
|
$sortDirection = $filters['sort_direction'] ?? 'desc';
|
|
$query->orderBy($sortBy, $sortDirection);
|
|
|
|
return $query->paginate($perPage);
|
|
}
|
|
|
|
/**
|
|
* 특정 아카이브 레코드 조회
|
|
*/
|
|
public function getArchivedRecordById(int $id): ?ArchivedRecord
|
|
{
|
|
return ArchivedRecord::with(['deletedByUser', 'relations'])
|
|
->find($id);
|
|
}
|
|
|
|
/**
|
|
* 삭제자 목록 조회 (필터용)
|
|
*/
|
|
public function getDeletedByUsers(): array
|
|
{
|
|
return ArchivedRecord::query()
|
|
->whereNotNull('deleted_by')
|
|
->with('deletedByUser:id,name')
|
|
->get()
|
|
->pluck('deletedByUser')
|
|
->filter()
|
|
->unique('id')
|
|
->values()
|
|
->toArray();
|
|
}
|
|
|
|
/**
|
|
* 아카이브 통계
|
|
*/
|
|
public function getStats(): array
|
|
{
|
|
return [
|
|
'total' => ArchivedRecord::count(),
|
|
'tenants' => ArchivedRecord::tenant()->count(),
|
|
'users' => ArchivedRecord::user()->count(),
|
|
'with_notes' => ArchivedRecord::whereNotNull('notes')
|
|
->where('notes', '!=', '')
|
|
->count(),
|
|
];
|
|
}
|
|
}
|