header('HX-Request')) { return response('', 200)->header('HX-Redirect', route('tenant-settings.index')); } $tenantId = session('selected_tenant_id'); $tenant = $tenantId ? Tenant::find($tenantId) : null; // 품목유형 목록 (common_codes에서 조회) $itemTypeLabels = $tenantId ? CommonCode::getItemTypes($tenantId) : []; // 테넌트 미선택 시 빈 설정 $allSettings = collect(); if ($tenantId) { $allSettings = TenantSetting::withoutGlobalScopes() ->where('tenant_id', $tenantId) ->get(); } $stockSettings = $allSettings->where('setting_group', 'stock')->keyBy('setting_key'); $companySettings = $allSettings->where('setting_group', 'company')->keyBy('setting_key'); // 재고 설정값 $hasSettings = $stockSettings->isNotEmpty(); $stockItemTypes = $stockSettings->get('stock_item_types')?->setting_value ?? []; $defaultSafetyStock = $stockSettings->get('default_safety_stock')?->setting_value ?? 10; $lowStockAlert = $stockSettings->get('low_stock_alert')?->setting_value ?? true; // 회사 표시명 설정값 $displayCompanyName = $companySettings->get('display_company_name')?->setting_value ?? ''; return view('tenant-settings.index', [ 'tenant' => $tenant, 'hasSettings' => $hasSettings, 'itemTypeLabels' => $itemTypeLabels, 'stockItemTypes' => $stockItemTypes, 'defaultSafetyStock' => $defaultSafetyStock, 'lowStockAlert' => $lowStockAlert, 'displayCompanyName' => $displayCompanyName, ]); } /** * 설정 저장 */ public function store(Request $request): RedirectResponse { $tenantId = session('selected_tenant_id'); if (! $tenantId) { return redirect()->route('tenant-settings.index') ->with('error', '테넌트를 먼저 선택해주세요.'); } $userId = Auth::id(); // 유효한 품목유형 목록 조회 $validItemTypes = array_keys(CommonCode::getItemTypes($tenantId)); $validated = $request->validate([ 'stock_item_types' => 'required|array|min:1', 'stock_item_types.*' => 'string|in:'.implode(',', $validItemTypes), 'default_safety_stock' => 'required|integer|min:0|max:9999', 'low_stock_alert' => 'nullable|boolean', 'display_company_name' => 'nullable|string|max:100', ]); // 재고관리 품목유형 저장 TenantSetting::withoutGlobalScopes()->updateOrCreate( [ 'tenant_id' => $tenantId, 'setting_group' => 'stock', 'setting_key' => 'stock_item_types', ], [ 'setting_value' => $validated['stock_item_types'], 'description' => '재고관리 대상 품목유형', 'updated_by' => $userId, ] ); // 기본 안전재고 저장 TenantSetting::withoutGlobalScopes()->updateOrCreate( [ 'tenant_id' => $tenantId, 'setting_group' => 'stock', 'setting_key' => 'default_safety_stock', ], [ 'setting_value' => (int) $validated['default_safety_stock'], 'description' => '안전재고 기본값', 'updated_by' => $userId, ] ); // 재고부족 알림 저장 TenantSetting::withoutGlobalScopes()->updateOrCreate( [ 'tenant_id' => $tenantId, 'setting_group' => 'stock', 'setting_key' => 'low_stock_alert', ], [ 'setting_value' => isset($validated['low_stock_alert']) && $validated['low_stock_alert'], 'description' => '재고부족 알림 활성화', 'updated_by' => $userId, ] ); // 회사 표시명 저장 TenantSetting::withoutGlobalScopes()->updateOrCreate( [ 'tenant_id' => $tenantId, 'setting_group' => 'company', 'setting_key' => 'display_company_name', ], [ 'setting_value' => trim($validated['display_company_name'] ?? ''), 'description' => '문서에 인쇄되는 회사 표시명', 'updated_by' => $userId, ] ); return redirect()->route('tenant-settings.index') ->with('success', '설정이 저장되었습니다.'); } }