128 lines
4.4 KiB
PHP
128 lines
4.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Products\CommonCode;
|
|
use App\Models\Tenants\Tenant;
|
|
use App\Models\Tenants\TenantSetting;
|
|
use Illuminate\Contracts\View\View;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Response;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class TenantSettingController extends Controller
|
|
{
|
|
/**
|
|
* 설정 목록 (재고 설정 페이지)
|
|
*/
|
|
public function index(Request $request): View|Response
|
|
{
|
|
// HTMX 요청 시 전체 페이지 리로드
|
|
if ($request->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) : [];
|
|
|
|
// 테넌트 미선택 시 빈 설정
|
|
$stockSettings = collect();
|
|
if ($tenantId) {
|
|
$stockSettings = TenantSetting::withoutGlobalScopes()
|
|
->where('tenant_id', $tenantId)
|
|
->where('setting_group', 'stock')
|
|
->get()
|
|
->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;
|
|
|
|
return view('tenant-settings.index', [
|
|
'tenant' => $tenant,
|
|
'hasSettings' => $hasSettings,
|
|
'itemTypeLabels' => $itemTypeLabels,
|
|
'stockItemTypes' => $stockItemTypes,
|
|
'defaultSafetyStock' => $defaultSafetyStock,
|
|
'lowStockAlert' => $lowStockAlert,
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 설정 저장
|
|
*/
|
|
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',
|
|
]);
|
|
|
|
// 재고관리 품목유형 저장
|
|
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,
|
|
]
|
|
);
|
|
|
|
return redirect()->route('tenant-settings.index')
|
|
->with('success', '설정이 저장되었습니다.');
|
|
}
|
|
}
|