integrallis/stripe_saas

View on GitHub
app/concerns/stripe_saas/plan.rb

Summary

Maintainability
A
0 mins
Test Coverage
module StripeSaas::Plan
  extend ActiveSupport::Concern

  included do
    monetize :price_cents
  end

  def is_upgrade_from?(plan)
    (price_cents || 0) >= (plan.price_cents || 0)
  end

  def is_downgrade_from?(plan)
    !is_upgrade_from?(plan)
  end

  def free?
    price_cents.zero?
  end

  def add_feature(feature, value, display_value=nil)
    feature = Feature.find_by(name: feature.to_s) if feature.is_a?(String) || feature.is_a?(Symbol)

    raise(ActiveRecord::RecordNotFound, "The feature #{feature.to_s} does not exist") if feature.nil?

    plan_features.find_or_create_by(feature: feature).update({
      value: value,
      display_value: display_value
    })
  end

  def has_feature?(feature)
    if feature.is_a?(String)
      !features.find_by(name: feature).nil?
    else
      features.any? { |f| f.id == feature.id }
    end
  end

  def boolean_plan_features
    plan_features.joins(:feature).where(features: {feature_type: 'boolean'}).order("features.display_order")
  end

  def non_boolean_plan_features
    plan_features.joins(:feature).where.not(features: {feature_type: 'boolean'}).order("features.display_order")
  end

  def feature_value(feature)
    plan_features.joins(:feature).find_by(features: {name: feature.to_s}).value
  end

  def allows?(feature)
    plan_feature = plan_features.joins(:feature).find_by(features: {name: feature.to_s})
    plan_feature.feature.feature_type == 'boolean' ? plan_feature.value : (plan_feature.value > 0)
  end

  def metadata
    self.metadata_as_json.present? ? JSON::parse(self.metadata_as_json) : {}
  end

  def metadata=(metadata_hash)
    self.metadata_as_json = metadata_hash.to_json
  end

end