# 변경 내용 요약 **날짜:** 2025-11-11 14:50 **작업자:** Claude Code **이슈:** SAM Admin 테넌트 컨텍스트 전환 시스템 구현 ## 📋 변경 개요 SAM Admin 시스템에 테넌트 컨텍스트 전환 기능을 추가했습니다. Admin 사용자가 "전체 보기" 모드와 특정 테넌트 필터링 모드를 자유롭게 전환할 수 있습니다. **주요 기능:** - TenantSelectorWidget: 전체 보기/특정 테넌트 선택 드롭다운 - AppliesTenantScope Trait: 모든 Resource에 자동 테넌트 필터링 적용 - 통계 표시: 현재 컨텍스트에 따른 사용자/제품 수 표시 - 컨텍스트 알림: 현재 보고 있는 테넌트 정보 시각적 표시 ## 🔧 사용된 도구 **네이티브 도구:** - **Read**: 기존 파일 분석 (12회) - **Edit**: 파일 수정 (9회) - **Write**: 신규 파일 생성 (2회) - **Bash**: Laravel Pint 실행, 타임스탬프 생성 ## 📁 수정된 파일 **신규 파일 생성 (1개):** 1. `admin/app/Filament/Concerns/AppliesTenantScope.php` - 테넌트 필터링 Trait **기존 파일 수정 (11개):** 2. `admin/app/Filament/Widgets/TenantSelectorWidget.php` - 전체 보기 옵션 추가 3. `admin/resources/views/filament/widgets/tenant-selector.blade.php` - UI 개선 4. `admin/app/Filament/Resources/Products/ProductResource.php` - Trait 적용 5. `admin/app/Filament/Resources/MaterialResource.php` - Trait 적용 6. `admin/app/Filament/Resources/CategoryResource.php` - Trait 적용 7. `admin/app/Filament/Resources/ClientResource.php` - Trait 적용 8. `admin/app/Filament/Resources/EstimateResource.php` - Trait 적용 9. `admin/app/Filament/Resources/ProductComponentResource.php` - Trait 적용 10. `admin/app/Filament/Resources/ClassificationResource.php` - Trait 적용 11. `admin/app/Filament/Resources/Menus/MenuResource.php` - Trait 적용 12. `admin/app/Filament/Resources/Categories/CategoryResource.php` - Trait 적용 ## 🔧 상세 변경 사항 ### 1. AppliesTenantScope Trait 생성 **파일:** `admin/app/Filament/Concerns/AppliesTenantScope.php` **기능:** ```php trait AppliesTenantScope { protected static ?string $tenantColumn = 'tenant_id'; public static function getEloquentQuery(): Builder { $query = parent::getEloquentQuery(); $selectedTenantId = Session::get('selected_tenant_id'); // "전체 보기" 모드가 아닌 경우에만 필터 적용 if ($selectedTenantId !== null && $selectedTenantId !== 'all') { $tenantColumn = static::$tenantColumn ?? 'tenant_id'; $query->where($tenantColumn, $selectedTenantId); } return $query; } } ``` **특징:** - Session 기반 테넌트 컨텍스트 관리 - "전체 보기" 모드에서는 필터 미적용 - 커스텀 tenant_id 컬럼명 지원 (`$tenantColumn` 오버라이드 가능) - 모든 Filament Resource에 재사용 가능 --- ### 2. TenantSelectorWidget 개선 **파일:** `admin/app/Filament/Widgets/TenantSelectorWidget.php` **추가된 기능:** - `isViewingAll()`: 전체 보기 모드 여부 확인 - `getTenantStats()`: 현재 컨텍스트에 따른 통계 계산 - `updatedSelectedTenantId()`: 테넌트 변경 시 Session 관리 및 페이지 리로드 **변경 후:** ```php public function updatedSelectedTenantId($value) { if ($value === 'all') { Session::forget('selected_tenant_id'); } else { Session::put('selected_tenant_id', $value); } $this->dispatch('tenant-changed'); } public function getTenantStats() { $tenantId = Session::get('selected_tenant_id'); if ($tenantId) { // 특정 테넌트 통계 return [ 'users' => User::whereHas('tenantsMembership', function ($q) use ($tenantId) { $q->where('tenants.id', $tenantId); })->count(), 'products' => Product::where('tenant_id', $tenantId)->count(), ]; } // 전체 통계 return [ 'users' => User::count(), 'products' => Product::count(), 'tenants' => Tenant::active()->count(), ]; } ``` --- ### 3. TenantSelector Blade 템플릿 개선 **파일:** `admin/resources/views/filament/widgets/tenant-selector.blade.php` **추가된 UI 요소:** ```blade {{-- 테넌트 선택 드롭다운 --}} {{-- 통계 표시 --}}