'lite','admin_bookings'=>'lite','opening_hours'=>'lite','single_operations'=>'lite', 'basic_pricing'=>'lite','notifications'=>'lite','pay_on_site'=>'lite','receivables'=>'lite', 'debtor_blocking'=>'lite','statistics_basic'=>'lite', 'online_bookings'=>'starter','advanced_pricing'=>'starter','multi_resource_operations'=>'starter','recurring_bookings'=>'starter', 'bank_transfer'=>'starter','bank_qr'=>'starter', 'memberships'=>'club','member_import'=>'club','bulk_membership_renewal'=>'club','member_benefits'=>'club', 'usage_limits'=>'club','customer_restrictions'=>'club','statistics_advanced'=>'club','report_exports'=>'club', 'credits'=>'pro','financial_reporting'=>'pro', ]; public static function features(string $plan):array { $rank=array_search($plan,self::PLANS,true);if($rank===false)throw new \InvalidArgumentException('Unknown commercial plan'); $result=[];foreach(self::FEATURES as $feature=>$minimum)$result[$feature]=$rank>=array_search($minimum,self::PLANS,true);return $result; } public static function resourceLimit(string $plan):?int{self::features($plan);return null;} public static function onlineResourceLimit(string $plan):?int{return match($plan){'lite'=>0,'starter'=>4,'club','pro'=>null,default=>throw new \InvalidArgumentException('Unknown commercial plan')};} }