Revert "fix: [tenant-console] 테넌트 콘솔 분리작업"

This reverts commit 8da1702e
This commit is contained in:
2026-03-13 21:24:18 +09:00
parent c3bc7912dd
commit 432888980b
70 changed files with 423 additions and 1173 deletions

View File

@@ -22,7 +22,7 @@ public function index(Request $request): View|JsonResponse
\Log::info('Board request all:', $request->all());
\Log::info('Board request query:', $request->query());
$filters = $request->only(['search', 'board_type', 'is_active', 'trashed', 'sort_by', 'sort_direction', 'tenant_id']);
$filters = $request->only(['search', 'board_type', 'is_active', 'trashed', 'sort_by', 'sort_direction']);
\Log::info('Board filters:', $filters);
@@ -30,15 +30,7 @@ public function index(Request $request): View|JsonResponse
// HTMX 요청이면 HTML 파셜 반환
if ($request->header('HX-Request')) {
$consoleTenantId = $request->get('tenant_console_id');
$isTenantConsole = ! empty($consoleTenantId);
// TenantHelper가 테넌트 콘솔 컨텍스트를 인식하도록 request attribute 설정
if ($isTenantConsole) {
$request->attributes->set('tenant_console_id', $consoleTenantId);
}
return view('boards.partials.table', compact('boards', 'isTenantConsole', 'consoleTenantId'));
return view('boards.partials.table', compact('boards'));
}
// 일반 요청이면 JSON

View File

@@ -18,7 +18,7 @@ class CategoryApiController extends Controller
*/
public function list(Request $request): JsonResponse
{
$tenantId = $request->input('tenant_id') ?: session('selected_tenant_id');
$tenantId = session('selected_tenant_id');
if (! $tenantId) {
return response()->json(['success' => false, 'data' => []]);
}
@@ -44,7 +44,7 @@ public function list(Request $request): JsonResponse
*/
public function tree(Request $request): View
{
$tenantId = $request->input('tenant_id') ?: session('selected_tenant_id');
$tenantId = session('selected_tenant_id');
$codeGroup = $request->input('code_group', 'product');
$categories = collect();
@@ -82,7 +82,7 @@ public function show(int $id): JsonResponse
*/
public function store(Request $request): JsonResponse
{
$tenantId = $request->input('tenant_id') ?: session('selected_tenant_id');
$tenantId = session('selected_tenant_id');
if (! $tenantId) {
return response()->json(['success' => false, 'message' => '테넌트를 선택해주세요.'], 400);
}
@@ -218,10 +218,10 @@ public function toggle(int $id): JsonResponse
/**
* 테넌트 카테고리를 글로벌로 복사 (HQ 또는 슈퍼관리자)
*/
public function promoteToGlobal(Request $request, int $id): JsonResponse
public function promoteToGlobal(int $id): JsonResponse
{
$user = Auth::user();
$tenantId = $request->input('tenant_id') ?: session('selected_tenant_id');
$tenantId = session('selected_tenant_id');
$tenant = $tenantId ? \App\Models\Tenants\Tenant::find($tenantId) : null;
$isHQ = $tenant?->tenant_type === 'HQ';
$isSuperAdmin = $user?->isSuperAdmin() ?? false;

View File

@@ -21,11 +21,6 @@ public function __construct(DepartmentPermissionService $departmentPermissionSer
*/
protected function getEffectiveTenantId(Request $request, ?int $departmentId = null): ?int
{
// 명시적 tenant_id 파라미터 우선 (테넌트 콘솔 API 호출)
if ($request->has('tenant_id') && $request->input('tenant_id')) {
return (int) $request->input('tenant_id');
}
$sessionTenantId = session('selected_tenant_id');
// 세션에 특정 테넌트가 선택되어 있으면 그것을 사용

View File

@@ -27,14 +27,7 @@ public function index(Request $request)
// HTMX 요청 시 부분 HTML 반환
if ($request->header('HX-Request')) {
$consoleTenantId = $request->get('tenant_console_id');
$isTenantConsole = ! empty($consoleTenantId);
if ($isTenantConsole) {
$request->attributes->set('tenant_console_id', $consoleTenantId);
}
return view('permissions.partials.table', compact('permissions', 'isTenantConsole', 'consoleTenantId'));
return view('permissions.partials.table', compact('permissions'));
}
// 일반 요청 시 JSON 반환

View File

@@ -27,14 +27,7 @@ public function index(Request $request): JsonResponse|\Illuminate\Contracts\View
// HTMX 요청 시 HTML 반환
if ($request->header('HX-Request')) {
$consoleTenantId = $request->get('tenant_console_id');
$isTenantConsole = ! empty($consoleTenantId);
if ($isTenantConsole) {
$request->attributes->set('tenant_console_id', $consoleTenantId);
}
return view('roles.partials.table', compact('roles', 'isTenantConsole', 'consoleTenantId'));
return view('roles.partials.table', compact('roles'));
}
// 일반 요청 시 JSON 반환

View File

@@ -21,11 +21,6 @@ public function __construct(RolePermissionService $rolePermissionService)
*/
protected function getEffectiveTenantId(Request $request, ?int $roleId = null): ?int
{
// 명시적 tenant_id 파라미터 우선 (테넌트 콘솔 API 호출)
if ($request->has('tenant_id') && $request->input('tenant_id')) {
return (int) $request->input('tenant_id');
}
$sessionTenantId = session('selected_tenant_id');
// 세션에 특정 테넌트가 선택되어 있으면 그것을 사용

View File

@@ -29,13 +29,8 @@ public function index(Request $request): View
$query->where('action', $request->action);
}
// 테넌트 필터 (테넌트 콘솔에서는 해당 테넌트만)
$consoleTenantId = \App\Helpers\TenantHelper::isTenantConsole()
? \App\Helpers\TenantHelper::getEffectiveTenantId()
: null;
if ($consoleTenantId) {
$query->where('tenant_id', $consoleTenantId);
} elseif ($request->filled('tenant_id')) {
// 테넌트 필터
if ($request->filled('tenant_id')) {
$query->where('tenant_id', $request->tenant_id);
}
@@ -73,12 +68,9 @@ public function index(Request $request): View
/**
* 감사 로그 상세
* tenant-console/{tenantId}/audit-logs/{id} 에서
* $id에 tenantId가 들어오는 문제 방지 → route('id')로 명시적 추출
*/
public function show(int $id): View
{
$id = (int) (request()->route('id') ?? $id);
$log = AuditLog::with(['tenant', 'actor'])->findOrFail($id);
return view('audit-logs.show', compact('log'));

View File

@@ -2,8 +2,6 @@
namespace App\Http\Controllers;
use App\Helpers\TenantHelper;
use App\Models\Tenants\Tenant;
use App\Services\BoardService;
use Illuminate\View\View;
@@ -19,10 +17,7 @@ public function __construct(
public function index(): View
{
$boardTypes = $this->boardService->getBoardTypes();
$consoleTenantId = TenantHelper::getEffectiveTenantId();
$currentTenant = TenantHelper::isTenantConsole()
? Tenant::find($consoleTenantId)
: auth()->user()->currentTenant();
$currentTenant = auth()->user()->currentTenant();
return view('boards.index', compact('boardTypes', 'currentTenant'));
}
@@ -37,12 +32,9 @@ public function create(): View
/**
* 게시판 수정 화면
* tenant-console/{tenantId}/boards/{id}/edit 에서
* $id에 tenantId가 들어오는 문제 방지 → route('id')로 명시적 추출
*/
public function edit(int $id): View
{
$id = (int) (request()->route('id') ?? $id);
// systemOnly=false: 테넌트 게시판도 수정 가능
$board = $this->boardService->getBoardById($id, true, false);

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use App\Helpers\TenantHelper;
use App\Models\Category;
use App\Models\GlobalCategory;
use App\Models\Tenants\Tenant;
@@ -19,7 +18,7 @@ class CategoryController extends Controller
*/
private function getCustomGroupLabels(): array
{
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
if (! $tenantId) {
return [];
}
@@ -38,7 +37,7 @@ private function getCustomGroupLabels(): array
*/
public function storeGroup(Request $request): RedirectResponse
{
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
if (! $tenantId) {
return redirect()->back()->with('error', '테넌트를 먼저 선택해주세요.');
}
@@ -84,7 +83,7 @@ public function storeGroup(Request $request): RedirectResponse
);
return redirect()
->to(TenantHelper::route('categories.index', ['group' => $groupCode]))
->route('categories.index', ['group' => $groupCode])
->with('success', "'{$groupLabel}' 그룹이 추가되었습니다.");
}
@@ -95,10 +94,10 @@ public function index(Request $request): View|Response
{
// HTMX 요청 시 전체 페이지 리로드
if ($request->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', TenantHelper::route('categories.index'));
return response('', 200)->header('HX-Redirect', route('categories.index'));
}
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
$tenant = $tenantId ? Tenant::find($tenantId) : null;
$isHQ = $tenantId == 1;

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use App\Helpers\TenantHelper;
use App\Models\Products\CommonCode;
use App\Models\Tenants\Tenant;
use App\Models\Tenants\TenantSetting;
@@ -22,10 +21,10 @@ public function index(Request $request): View|Response
{
// HTMX 요청 시 전체 페이지 리로드
if ($request->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', TenantHelper::route('common-codes.index'));
return response('', 200)->header('HX-Redirect', route('common-codes.index'));
}
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
$tenant = $tenantId ? Tenant::find($tenantId) : null;
$isHQ = $tenant?->tenant_type === 'HQ';
@@ -133,7 +132,7 @@ public function index(Request $request): View|Response
*/
private function getCustomGroupLabels(): array
{
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
if (! $tenantId) {
return [];
}
@@ -152,7 +151,7 @@ private function getCustomGroupLabels(): array
*/
public function storeGroup(Request $request): RedirectResponse
{
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
if (! $tenantId) {
return redirect()->back()->with('error', '테넌트를 먼저 선택해주세요.');
}
@@ -198,7 +197,7 @@ public function storeGroup(Request $request): RedirectResponse
);
return redirect()
->to(TenantHelper::route('common-codes.index', ['group' => $groupCode]))
->route('common-codes.index', ['group' => $groupCode])
->with('success', "'{$groupLabel}' 그룹이 추가되었습니다.");
}
@@ -207,7 +206,7 @@ public function storeGroup(Request $request): RedirectResponse
*/
public function store(Request $request): RedirectResponse
{
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
$tenant = $tenantId ? Tenant::find($tenantId) : null;
if (! $tenantId) {
@@ -256,7 +255,7 @@ public function store(Request $request): RedirectResponse
]);
return redirect()
->to(TenantHelper::route('common-codes.index', ['group' => $validated['code_group']]))
->route('common-codes.index', ['group' => $validated['code_group']])
->with('success', '코드가 추가되었습니다.');
}
@@ -265,8 +264,7 @@ public function store(Request $request): RedirectResponse
*/
public function update(Request $request, int $id): RedirectResponse|JsonResponse
{
$id = (int) (request()->route('id') ?? $id);
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
$tenant = $tenantId ? Tenant::find($tenantId) : null;
if (! $tenantId) {
@@ -339,7 +337,7 @@ public function update(Request $request, int $id): RedirectResponse|JsonResponse
}
return redirect()
->to(TenantHelper::route('common-codes.index', ['group' => $code->code_group]))
->route('common-codes.index', ['group' => $code->code_group])
->with('success', '코드가 수정되었습니다.');
}
@@ -348,8 +346,7 @@ public function update(Request $request, int $id): RedirectResponse|JsonResponse
*/
public function toggle(Request $request, int $id): JsonResponse
{
$id = (int) (request()->route('id') ?? $id);
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
$tenant = $tenantId ? Tenant::find($tenantId) : null;
if (! $tenantId) {
@@ -391,7 +388,7 @@ public function toggle(Request $request, int $id): JsonResponse
*/
public function bulkPromoteToGlobal(Request $request): RedirectResponse|JsonResponse
{
$tenant = TenantHelper::getEffectiveTenantId() ? Tenant::find(TenantHelper::getEffectiveTenantId()) : null;
$tenant = session('selected_tenant_id') ? Tenant::find(session('selected_tenant_id')) : null;
$isHQ = $tenant?->tenant_type === 'HQ';
$isSuperAdmin = auth()->user()?->isSuperAdmin() ?? false;
@@ -465,7 +462,7 @@ public function bulkPromoteToGlobal(Request $request): RedirectResponse|JsonResp
}
return redirect()
->to(TenantHelper::route('common-codes.index', ['group' => $codeGroup ?? 'item_type']))
->route('common-codes.index', ['group' => $codeGroup ?? 'item_type'])
->with('success', $message);
}
@@ -474,8 +471,7 @@ public function bulkPromoteToGlobal(Request $request): RedirectResponse|JsonResp
*/
public function copy(Request $request, int $id): RedirectResponse|JsonResponse
{
$id = (int) (request()->route('id') ?? $id);
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
if (! $tenantId) {
if ($request->ajax()) {
@@ -525,7 +521,7 @@ public function copy(Request $request, int $id): RedirectResponse|JsonResponse
}
return redirect()
->to(TenantHelper::route('common-codes.index', ['group' => $globalCode->code_group]))
->route('common-codes.index', ['group' => $globalCode->code_group])
->with('success', '글로벌 코드가 테넌트용으로 복사되었습니다.');
}
@@ -534,7 +530,7 @@ public function copy(Request $request, int $id): RedirectResponse|JsonResponse
*/
public function bulkCopy(Request $request): RedirectResponse|JsonResponse
{
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
if (! $tenantId) {
if ($request->ajax()) {
@@ -623,7 +619,7 @@ public function bulkCopy(Request $request): RedirectResponse|JsonResponse
}
return redirect()
->to(TenantHelper::route('common-codes.index', ['group' => $codeGroup ?? 'item_type']))
->route('common-codes.index', ['group' => $codeGroup ?? 'item_type'])
->with('success', $message);
}
@@ -632,8 +628,7 @@ public function bulkCopy(Request $request): RedirectResponse|JsonResponse
*/
public function promoteToGlobal(Request $request, int $id): RedirectResponse|JsonResponse
{
$id = (int) (request()->route('id') ?? $id);
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
$tenant = $tenantId ? Tenant::find($tenantId) : null;
$isHQ = $tenant?->tenant_type === 'HQ';
$isSuperAdmin = auth()->user()?->isSuperAdmin() ?? false;
@@ -685,7 +680,7 @@ public function promoteToGlobal(Request $request, int $id): RedirectResponse|Jso
}
return redirect()
->to(TenantHelper::route('common-codes.index', ['group' => $tenantCode->code_group]))
->route('common-codes.index', ['group' => $tenantCode->code_group])
->with('success', '테넌트 코드가 글로벌로 복사되었습니다.');
}
@@ -694,8 +689,7 @@ public function promoteToGlobal(Request $request, int $id): RedirectResponse|Jso
*/
public function destroy(Request $request, int $id): RedirectResponse|JsonResponse
{
$id = (int) (request()->route('id') ?? $id);
$tenantId = TenantHelper::getEffectiveTenantId();
$tenantId = session('selected_tenant_id');
$tenant = $tenantId ? Tenant::find($tenantId) : null;
if (! $tenantId) {
@@ -748,7 +742,7 @@ public function destroy(Request $request, int $id): RedirectResponse|JsonRespons
}
return redirect()
->to(TenantHelper::route('common-codes.index', ['group' => $codeGroup]))
->route('common-codes.index', ['group' => $codeGroup])
->with('success', '코드가 삭제되었습니다.');
}
}

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use App\Helpers\TenantHelper;
use App\Models\Tenants\Department;
use App\Models\Tenants\Tenant;
use App\Services\DepartmentPermissionService;
@@ -22,7 +21,7 @@ public function __construct(DepartmentPermissionService $departmentPermissionSer
*/
public function index(Request $request)
{
$tenantId = TenantHelper::getRawTenantId();
$tenantId = session('selected_tenant_id');
// 부서 목록 조회
$departmentsQuery = Department::query()->orderBy('tenant_id')->orderBy('sort_order')->orderBy('name');

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use App\Helpers\TenantHelper;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\View\View;
@@ -16,7 +15,7 @@ class ItemManagementController extends Controller
public function index(Request $request): View|Response
{
if ($request->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', TenantHelper::route('item-management.index'));
return response('', 200)->header('HX-Redirect', route('item-management.index'));
}
return view('item-management.index');

View File

@@ -26,12 +26,9 @@ public function create()
/**
* 권한 수정 화면
* tenant-console/{tenantId}/permissions/{id}/edit 에서
* $id에 tenantId가 들어오는 문제 방지 → route('id')로 명시적 추출
*/
public function edit($id)
{
$id = request()->route('id') ?? $id;
$tenants = Tenant::orderBy('company_name')->get();
return view('permissions.edit', compact('id', 'tenants'));

View File

@@ -49,12 +49,9 @@ public function create(): View
/**
* 역할 수정 화면
* tenant-console/{tenantId}/roles/{id}/edit 에서
* $id에 tenantId가 들어오는 문제 방지 → route('id')로 명시적 추출
*/
public function edit(int $id): View
{
$id = (int) (request()->route('id') ?? $id);
$role = $this->roleService->getRoleById($id);
if (! $role) {

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use App\Helpers\TenantHelper;
use App\Models\Role;
use App\Models\Tenants\Tenant;
use App\Services\RolePermissionService;
@@ -22,7 +21,7 @@ public function __construct(RolePermissionService $rolePermissionService)
*/
public function index(Request $request)
{
$tenantId = TenantHelper::getRawTenantId();
$tenantId = session('selected_tenant_id');
// 역할 목록 조회
$rolesQuery = Role::query()->orderBy('tenant_id')->orderBy('name');

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers\System;
use App\Helpers\TenantHelper;
use App\Http\Controllers\Controller;
use App\Models\System\AiConfig;
use Illuminate\Http\JsonResponse;
@@ -18,7 +17,7 @@ class AiConfigController extends Controller
public function index(Request $request): View|Response
{
if ($request->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', TenantHelper::route('system.ai-config.index'));
return response('', 200)->header('HX-Redirect', route('system.ai-config.index'));
}
// AI 설정 (gemini, claude, openai)

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers\System;
use App\Helpers\TenantHelper;
use App\Http\Controllers\Controller;
use App\Models\System\Holiday;
use Illuminate\Http\JsonResponse;
@@ -15,7 +14,7 @@ class HolidayController extends Controller
public function index(Request $request): View|Response
{
if ($request->header('HX-Request')) {
return response('', 200)->header('HX-Redirect', TenantHelper::route('system.holidays.index'));
return response('', 200)->header('HX-Redirect', route('system.holidays.index'));
}
return view('system.holidays.index');
@@ -23,7 +22,7 @@ public function index(Request $request): View|Response
public function list(Request $request): JsonResponse
{
$tenantId = TenantHelper::getEffectiveTenantId(1);
$tenantId = session('selected_tenant_id', 1);
$year = $request->input('year', now()->year);
$holidays = Holiday::forTenant($tenantId)
@@ -60,7 +59,7 @@ public function store(Request $request): JsonResponse
'memo' => 'nullable|string|max:500',
]);
$tenantId = TenantHelper::getEffectiveTenantId(1);
$tenantId = session('selected_tenant_id', 1);
// 중복 체크: 같은 날짜 + 같은 이름
$exists = Holiday::forTenant($tenantId)
@@ -95,7 +94,7 @@ public function store(Request $request): JsonResponse
public function update(Request $request, int $id): JsonResponse
{
$tenantId = TenantHelper::getEffectiveTenantId(1);
$tenantId = session('selected_tenant_id', 1);
$holiday = Holiday::forTenant($tenantId)->findOrFail($id);
$request->validate([
@@ -124,7 +123,7 @@ public function update(Request $request, int $id): JsonResponse
public function destroy(int $id): JsonResponse
{
$tenantId = TenantHelper::getEffectiveTenantId(1);
$tenantId = session('selected_tenant_id', 1);
$holiday = Holiday::forTenant($tenantId)->findOrFail($id);
$holiday->delete();
@@ -145,7 +144,7 @@ public function bulkStore(Request $request): JsonResponse
'holidays.*.isRecurring' => 'boolean',
]);
$tenantId = TenantHelper::getEffectiveTenantId(1);
$tenantId = session('selected_tenant_id', 1);
$count = 0;
$skipped = 0;
@@ -195,7 +194,7 @@ public function destroyByYear(Request $request): JsonResponse
'year' => 'required|integer|min:2000|max:2100',
]);
$tenantId = TenantHelper::getEffectiveTenantId(1);
$tenantId = session('selected_tenant_id', 1);
$year = $request->input('year');
$count = Holiday::forTenant($tenantId)

View File

@@ -1,23 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Models\Tenants\Tenant;
use Illuminate\Http\Request;
use Illuminate\View\View;
class TenantConsoleController extends Controller
{
/**
* 테넌트 콘솔 대시보드 (새창 진입점)
*/
public function index(Request $request, int $tenantId): View
{
$tenant = $request->attributes->get('tenant_console');
return view('tenant-console.index', [
'tenant' => $tenant,
'tenantId' => $tenantId,
]);
}
}

View File

@@ -55,4 +55,23 @@ public function edit(int $id): View
return view('tenants.edit', compact('tenant', 'displayCompanyName'));
}
/**
* 테넌트 전환 (기존 기능 유지)
*/
public function switch(Request $request)
{
$tenantId = $request->input('tenant_id');
if ($tenantId === 'all') {
// "전체 보기" 대신 사용자의 HQ 테넌트로 설정
$hqTenant = auth()->user()->getHQTenant();
if ($hqTenant) {
$request->session()->put('selected_tenant_id', $hqTenant->id);
}
} else {
$request->session()->put('selected_tenant_id', $tenantId);
}
return redirect()->back();
}
}

View File

@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use App\Helpers\TenantHelper;
use App\Services\UserPermissionService;
use Illuminate\Http\Request;
@@ -20,7 +19,7 @@ public function __construct(UserPermissionService $userPermissionService)
*/
public function index(Request $request)
{
$tenantId = TenantHelper::getRawTenantId();
$tenantId = session('selected_tenant_id');
$selectedUserId = $request->query('user_id');
// 테넌트 미선택 또는 전체 선택 시