mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-03 20:48:07 +00:00 
			
		
		
		
	- Refactor HandleStripeEventService to better manage features by plan - Add constants for features available in each plan tier (Startup, Business, Enterprise) - Add channel_instagram to Startup plan features - Improve downgrade handling to properly disable higher-tier features - Clean up and optimize tests for maintainability - Add comprehensive test coverage for plan upgrades and downgrades --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
module SuperAdmin::AccountFeaturesHelper
 | 
						|
  def self.account_features
 | 
						|
    YAML.safe_load(Rails.root.join('config/features.yml').read).freeze
 | 
						|
  end
 | 
						|
 | 
						|
  def self.account_premium_features
 | 
						|
    account_features.filter { |feature| feature['premium'] }.pluck('name')
 | 
						|
  end
 | 
						|
 | 
						|
  # Returns a hash mapping feature names to their display names
 | 
						|
  def self.feature_display_names
 | 
						|
    account_features.each_with_object({}) do |feature, hash|
 | 
						|
      hash[feature['name']] = feature['display_name']
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def self.filter_internal_features(features)
 | 
						|
    return features if ChatwootApp.chatwoot_cloud?
 | 
						|
 | 
						|
    internal_features = account_features.select { |f| f['chatwoot_internal'] }.pluck('name')
 | 
						|
    features.except(*internal_features)
 | 
						|
  end
 | 
						|
 | 
						|
  def self.filter_deprecated_features(features)
 | 
						|
    deprecated_features = account_features.select { |f| f['deprecated'] }.pluck('name')
 | 
						|
    features.except(*deprecated_features)
 | 
						|
  end
 | 
						|
 | 
						|
  def self.sort_and_transform_features(features, display_names)
 | 
						|
    features.sort_by { |key, _| display_names[key] || key }
 | 
						|
            .to_h
 | 
						|
            .transform_keys { |key| [key, display_names[key]] }
 | 
						|
  end
 | 
						|
 | 
						|
  def self.partition_features(features)
 | 
						|
    filtered = filter_internal_features(features)
 | 
						|
    filtered = filter_deprecated_features(filtered)
 | 
						|
    display_names = feature_display_names
 | 
						|
 | 
						|
    regular, premium = filtered.partition { |key, _value| account_premium_features.exclude?(key) }
 | 
						|
 | 
						|
    [
 | 
						|
      sort_and_transform_features(regular, display_names),
 | 
						|
      sort_and_transform_features(premium, display_names)
 | 
						|
    ]
 | 
						|
  end
 | 
						|
 | 
						|
  def self.filtered_features(features)
 | 
						|
    regular, premium = partition_features(features)
 | 
						|
    regular.merge(premium)
 | 
						|
  end
 | 
						|
end
 |