diff --git a/app/Http/Controllers/DepartmentPermissionController.php b/app/Http/Controllers/DepartmentPermissionController.php index 3a4fc5b8..45e799b6 100644 --- a/app/Http/Controllers/DepartmentPermissionController.php +++ b/app/Http/Controllers/DepartmentPermissionController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers; +use App\Models\Tenants\Department; +use App\Models\Tenants\Tenant; use App\Services\DepartmentPermissionService; use Illuminate\Http\Request; @@ -22,14 +24,27 @@ public function index(Request $request) $tenantId = session('selected_tenant_id'); // 부서 목록 조회 - $departments = \App\Models\Tenants\Department::query(); + $departmentsQuery = Department::query()->orderBy('tenant_id')->orderBy('sort_order')->orderBy('name'); + if ($tenantId && $tenantId !== 'all') { - $departments->where('tenant_id', $tenantId); + // 특정 테넌트 선택 시 + $departments = $departmentsQuery->where('tenant_id', $tenantId)->get(); + $departmentsByTenant = null; + } else { + // 전체 선택 시 테넌트별 그룹핑 + $departments = $departmentsQuery->get(); + $departmentsByTenant = $departments->groupBy('tenant_id'); + + // 테넌트 정보 로드 + $tenantIds = $departmentsByTenant->keys()->filter()->toArray(); + $tenants = Tenant::whereIn('id', $tenantIds)->pluck('company_name', 'id'); } - $departments = $departments->orderBy('sort_order')->orderBy('name')->get(); return view('department-permissions.index', [ 'departments' => $departments, + 'departmentsByTenant' => $departmentsByTenant ?? null, + 'tenants' => $tenants ?? collect(), + 'selectedTenantId' => $tenantId, ]); } } diff --git a/app/Http/Controllers/RolePermissionController.php b/app/Http/Controllers/RolePermissionController.php index a558d3fe..aa05ed5a 100644 --- a/app/Http/Controllers/RolePermissionController.php +++ b/app/Http/Controllers/RolePermissionController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers; +use App\Models\Role; +use App\Models\Tenants\Tenant; use App\Services\RolePermissionService; use Illuminate\Http\Request; @@ -22,14 +24,27 @@ public function index(Request $request) $tenantId = session('selected_tenant_id'); // 역할 목록 조회 - $roles = \App\Models\Role::query(); + $rolesQuery = Role::query()->orderBy('tenant_id')->orderBy('name'); + if ($tenantId && $tenantId !== 'all') { - $roles->where('tenant_id', $tenantId); + // 특정 테넌트 선택 시 + $roles = $rolesQuery->where('tenant_id', $tenantId)->get(); + $rolesByTenant = null; + } else { + // 전체 선택 시 테넌트별 그룹핑 + $roles = $rolesQuery->get(); + $rolesByTenant = $roles->groupBy('tenant_id'); + + // 테넌트 정보 로드 + $tenantIds = $rolesByTenant->keys()->filter()->toArray(); + $tenants = Tenant::whereIn('id', $tenantIds)->pluck('company_name', 'id'); } - $roles = $roles->orderBy('name')->get(); return view('role-permissions.index', [ 'roles' => $roles, + 'rolesByTenant' => $rolesByTenant ?? null, + 'tenants' => $tenants ?? collect(), + 'selectedTenantId' => $tenantId, ]); } } diff --git a/docs/[MNG-2025-11-26] role-department-permission-tenant-grouping.md b/docs/[MNG-2025-11-26] role-department-permission-tenant-grouping.md new file mode 100644 index 00000000..7b45b86f --- /dev/null +++ b/docs/[MNG-2025-11-26] role-department-permission-tenant-grouping.md @@ -0,0 +1,50 @@ +# 역할/부서 권한 관리 - 테넌트별 그룹핑 + +## 변경 일자 +2025-11-26 + +## 변경 목적 +- "전체" 테넌트 선택 시 역할/부서가 혼합되어 표시되는 문제 해결 +- 테넌트별로 그룹핑하여 가독성 향상 + +## 변경 파일 + +### 1. Controllers +| 파일 | 변경 내용 | +|------|----------| +| `app/Http/Controllers/RolePermissionController.php` | 테넌트별 역할 그룹핑 로직 추가 | +| `app/Http/Controllers/DepartmentPermissionController.php` | 테넌트별 부서 그룹핑 로직 추가 | + +**주요 로직:** +```php +if ($tenantId && $tenantId !== 'all') { + // 특정 테넌트 선택 시 기존 방식 + $roles = $rolesQuery->where('tenant_id', $tenantId)->get(); + $rolesByTenant = null; +} else { + // 전체 선택 시 테넌트별 그룹핑 + $roles = $rolesQuery->get(); + $rolesByTenant = $roles->groupBy('tenant_id'); + $tenantIds = $rolesByTenant->keys()->filter()->toArray(); + $tenants = Tenant::whereIn('id', $tenantIds)->pluck('company_name', 'id'); +} +``` + +### 2. Views +| 파일 | 변경 내용 | +|------|----------| +| `resources/views/role-permissions/index.blade.php` | 테넌트별 섹션 헤더 및 그룹핑 UI | +| `resources/views/department-permissions/index.blade.php` | 테넌트별 섹션 헤더 및 그룹핑 UI | + +**UI 변경:** +- 전체 테넌트 선택 시: 테넌트별 섹션으로 구분 (회색 라벨) +- 선택된 역할/부서 표시: `[테넌트명] 역할명 역할` 형식 +- 기존 단일 테넌트 선택 시: 기존 UI 유지 + +## 테스트 결과 +- PHP 문법 검사: 통과 +- Laravel Pint: 통과 +- 브라우저 테스트: 테넌트별 그룹핑 정상 동작 + +## 관련 이슈 +- tenants 테이블 컬럼명: `company_name` (name 아님) diff --git a/resources/views/department-permissions/index.blade.php b/resources/views/department-permissions/index.blade.php index 27163114..80abef4e 100644 --- a/resources/views/department-permissions/index.blade.php +++ b/resources/views/department-permissions/index.blade.php @@ -11,25 +11,57 @@
-
- 부서 선택: - @foreach($departments as $department) - + @if($departmentsByTenant) + {{-- 전체 테넌트 선택 시: 테넌트별 그룹핑 --}} + @foreach($departmentsByTenant as $tenantId => $tenantDepartments) +
+
+ + {{ $tenants[$tenantId] ?? '미지정' }} + +
+
+ @foreach($tenantDepartments as $department) + + @endforeach +
+
@endforeach -
+ @else + {{-- 특정 테넌트 선택 시: 기존 방식 --}} +
+ 부서 선택: + @foreach($departments as $department) + + @endforeach +
+ @endif
@@ -109,9 +141,11 @@ function selectDepartment(button) { // 부서 정보 저장 const departmentId = button.getAttribute('data-department-id'); const departmentName = button.getAttribute('data-department-name'); + const tenantName = button.getAttribute('data-tenant-name'); document.getElementById('departmentIdInput').value = departmentId; - document.getElementById('selected-department-name').textContent = departmentName + ' 부서'; + const displayName = tenantName ? `[${tenantName}] ${departmentName} 부서` : `${departmentName} 부서`; + document.getElementById('selected-department-name').textContent = displayName; // 액션 버튼 표시 document.getElementById('action-buttons').style.display = 'block'; diff --git a/resources/views/role-permissions/index.blade.php b/resources/views/role-permissions/index.blade.php index c8e1c01c..096cd6ef 100644 --- a/resources/views/role-permissions/index.blade.php +++ b/resources/views/role-permissions/index.blade.php @@ -11,25 +11,57 @@
-
- 역할 선택: - @foreach($roles as $role) - + @if($rolesByTenant) + {{-- 전체 테넌트 선택 시: 테넌트별 그룹핑 --}} + @foreach($rolesByTenant as $tenantId => $tenantRoles) +
+
+ + {{ $tenants[$tenantId] ?? '미지정' }} + +
+
+ @foreach($tenantRoles as $role) + + @endforeach +
+
@endforeach -
+ @else + {{-- 특정 테넌트 선택 시: 기존 방식 --}} +
+ 역할 선택: + @foreach($roles as $role) + + @endforeach +
+ @endif
@@ -109,9 +141,11 @@ function selectRole(button) { // 역할 정보 저장 const roleId = button.getAttribute('data-role-id'); const roleName = button.getAttribute('data-role-name'); + const tenantName = button.getAttribute('data-tenant-name'); document.getElementById('roleIdInput').value = roleId; - document.getElementById('selected-role-name').textContent = roleName + ' 역할'; + const displayName = tenantName ? `[${tenantName}] ${roleName} 역할` : `${roleName} 역할`; + document.getElementById('selected-role-name').textContent = displayName; // 액션 버튼 표시 document.getElementById('action-buttons').style.display = 'block';