[ self::KEY_STOCK_ITEM_TYPES => ['RM', 'SM', 'CS', 'PT', 'SF'], self::KEY_DEFAULT_SAFETY_STOCK => 10, self::KEY_LOW_STOCK_ALERT => true, ], ]; /** * 특정 그룹의 모든 설정 조회 */ public function getByGroup(string $group): Collection { return TenantSetting::where('tenant_id', $this->tenantId()) ->group($group) ->get() ->mapWithKeys(function ($setting) { return [$setting->setting_key => $setting->setting_value]; }); } /** * 모든 설정 조회 (그룹별 구조화) */ public function getAll(): array { $settings = TenantSetting::where('tenant_id', $this->tenantId()) ->get() ->groupBy('setting_group') ->map(function ($group) { return $group->mapWithKeys(function ($setting) { return [$setting->setting_key => [ 'value' => $setting->setting_value, 'description' => $setting->description, 'updated_at' => $setting->updated_at?->toISOString(), ]]; }); }) ->toArray(); return $settings; } /** * 설정값 조회 (기본값 포함) */ public function get(string $group, string $key, $default = null) { $value = TenantSetting::getValue($this->tenantId(), $group, $key); if ($value !== null) { return $value; } // 기본값에서 찾기 if ($default === null && isset($this->defaults[$group][$key])) { return $this->defaults[$group][$key]; } return $default; } /** * 설정값 저장 */ public function set(string $group, string $key, $value, ?string $description = null): TenantSetting { return TenantSetting::setValue( $this->tenantId(), $group, $key, $value, $description, $this->apiUserId() ); } /** * 여러 설정값 일괄 저장 */ public function setMany(string $group, array $settings): array { $results = []; foreach ($settings as $key => $data) { $value = is_array($data) && isset($data['value']) ? $data['value'] : $data; $description = is_array($data) && isset($data['description']) ? $data['description'] : null; $results[$key] = $this->set($group, $key, $value, $description); } return $results; } /** * 설정 삭제 */ public function delete(string $group, string $key): bool { return TenantSetting::where('tenant_id', $this->tenantId()) ->where('setting_group', $group) ->where('setting_key', $key) ->delete() > 0; } /** * 재고관리 품목유형 조회 */ public function getStockItemTypes(): array { return $this->get(self::GROUP_STOCK, self::KEY_STOCK_ITEM_TYPES, ['RM', 'SM', 'CS', 'PT', 'SF']); } /** * 기본 안전재고 조회 */ public function getDefaultSafetyStock(): int { return (int) $this->get(self::GROUP_STOCK, self::KEY_DEFAULT_SAFETY_STOCK, 10); } /** * 재고부족 알림 활성화 여부 */ public function isLowStockAlertEnabled(): bool { return (bool) $this->get(self::GROUP_STOCK, self::KEY_LOW_STOCK_ALERT, true); } /** * 기본 설정으로 초기화 */ public function initializeDefaults(): array { $results = []; foreach ($this->defaults as $group => $settings) { foreach ($settings as $key => $value) { // 기존 설정이 없을 때만 생성 $existing = TenantSetting::getValue($this->tenantId(), $group, $key); if ($existing === null) { $results["{$group}.{$key}"] = $this->set($group, $key, $value, $this->getDefaultDescription($group, $key)); } } } return $results; } /** * 기본 설명 가져오기 */ private function getDefaultDescription(string $group, string $key): string { $descriptions = [ self::GROUP_STOCK => [ self::KEY_STOCK_ITEM_TYPES => '재고관리 대상 품목유형 (FG 완제품 제외)', self::KEY_DEFAULT_SAFETY_STOCK => '안전재고 기본값', self::KEY_LOW_STOCK_ALERT => '재고부족 알림 활성화', ], ]; return $descriptions[$group][$key] ?? ''; } }