'array', 'options' => 'array', 'is_active' => 'boolean', 'dev_cost' => 'decimal:0', 'monthly_fee' => 'decimal:0', ]; public const CATEGORY_BASIC = 'basic'; public const CATEGORY_INDIVIDUAL = 'individual'; public const CATEGORY_ADDON = 'addon'; public static function getCategories(): array { return [ self::CATEGORY_BASIC => '기본 패키지', self::CATEGORY_INDIVIDUAL => '개별 모듈', self::CATEGORY_ADDON => '부가 옵션', ]; } public function scopeActive($query) { return $query->where('is_active', true); } /** * AI 프롬프트에 주입할 활성 모듈 목록 조회 */ public static function getActiveModulesForPrompt(): array { return self::active() ->orderBy('sort_order') ->get() ->map(fn ($m) => [ 'module_code' => $m->module_code, 'module_name' => $m->module_name, 'category' => $m->category, 'description' => $m->description, 'keywords' => $m->keywords, 'dev_cost' => (int) $m->dev_cost, 'monthly_fee' => (int) $m->monthly_fee, ]) ->toArray(); } public function getOption(string $key, $default = null) { return data_get($this->options, $key, $default); } public function setOption(string $key, $value): void { $options = $this->options ?? []; data_set($options, $key, $value); $this->options = $options; $this->save(); } }