'boolean', 'status' => 'boolean', 'free_plan' => 'boolean', 'trial' => 'boolean', 'modules' => 'array', 'package_price_yearly' => 'decimal:2', 'package_price_monthly' => 'decimal:2', 'price_per_user_monthly' => 'decimal:2', 'price_per_user_yearly' => 'decimal:2', 'storage_limit' => 'integer', 'price_per_storage_monthly' => 'decimal:2', 'price_per_storage_yearly' => 'decimal:2', ]; public function creator(): BelongsTo { return $this->belongsTo(User::class, 'created_by'); } public function orders(): HasMany { return $this->hasMany(Order::class); } public function scopeActive($query) { return $query->where('status', true); } public function scopeDefault($query) { return $query->where('custom_plan', false); } public function scopeCustom($query) { return $query->where('custom_plan', true); } public function getAvailableModulesForUser($userId) { return self::getUserSubscriptionModules($userId); } public static function getUserSubscriptionModules($userId = null) { $user = $userId ? User::find($userId) : auth()->user(); if (!$user) { return []; } // Super admin has access to all modules if ($user->hasRole('superadmin')) { return (new Module())->allEnabled(); } $availableModules = []; // Get modules from user's active plan if ($user->active_plan) { $plan = self::find($user->active_plan); if ($plan && $plan->modules) { $availableModules = array_merge($availableModules, $plan->modules); } } // Get user's individually activated modules $userActiveModules = UserActiveModule::where('user_id', $user->id) ->pluck('module') ->toArray(); $availableModules = array_merge($availableModules, $userActiveModules); // Remove duplicates and ensure modules are actually enabled $enabledModules = (new Module())->allEnabled(); $availableModules = array_unique(array_intersect($availableModules, $enabledModules)); return array_values($availableModules); } }