Module: Satorix::Common::Pricing

Defined in:
lib/satorix/common/pricing.rb

Defined Under Namespace

Classes: InvalidNegativeTotalPrice, MissingApplicationConfigurationSettings, MissingPricingConfigurationElement

Class Method Summary collapse

Class Method Details

.package_defaults(package) ⇒ Object



18
19
20
# File 'lib/satorix/common/pricing.rb', line 18

def package_defaults(package)
  default_defaults.merge overrides_for(package)
end

.packagesObject



23
24
25
# File 'lib/satorix/common/pricing.rb', line 23

def packages
  overrides.keys
end

.pricingObject



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/satorix/common/pricing.rb', line 28

def pricing
  # Different Rails versions use different types for keys.
  pricing = ::Rails.application.secrets.satorix['pricing_in_cents'] ||
    ::Rails.application.secrets.satorix[:pricing_in_cents]

  raise(MissingApplicationConfigurationSettings, 'No pricing information configured.') if pricing.nil? || pricing.empty?

  pricing = Hash[pricing.map { |key, value| [key.to_sym, value] }]

  pricing
end

.pricing_for(attribute) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/satorix/common/pricing.rb', line 41

def pricing_for(attribute)
  price = pricing[secrets_key_for_attribute(attribute)]

  raise(MissingApplicationConfigurationSettings, "No pricing information configured for the '#{ attribute }' atttribute.") if price.nil?

  price
end

.scaled_attributesObject



92
93
94
95
96
# File 'lib/satorix/common/pricing.rb', line 92

def scaled_attributes
  # The key is the scaled attribute, the value is the attribute that modfies the scaled attribute.
  { staging_storage: :staging_hosts,
    production_storage: :production_hosts }
end

.scaling_modifier(attribute, configuration) ⇒ Object



86
87
88
89
# File 'lib/satorix/common/pricing.rb', line 86

def scaling_modifier(attribute, configuration)
  modifying_attribute = scaled_attributes[attribute]
  modifying_attribute ? configuration[modifying_attribute] : 1
end

.secrets_key_for_attribute(attribute) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/satorix/common/pricing.rb', line 56

def secrets_key_for_attribute(attribute)
  {
    base_cost: :base_cost,
    runners: :per_runner,
    gitlab_storage: :per_gb_of_gitlab_storage,
    staging_hosts: :per_staging_cluster_host,
    staging_storage: :per_staging_gb_of_storage_per_host,
    production_hosts: :per_production_cluster_host,
    production_storage: :per_production_gb_of_storage_per_host,
    premium_support: :support_package_premium,
    free_support: :support_package_free
  }[attribute]
end

.starting_price_for(package) ⇒ Object



50
51
52
53
# File 'lib/satorix/common/pricing.rb', line 50

def starting_price_for(package)
  settings = package_defaults(package)
  total_price settings
end

.total_price(configuration) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/satorix/common/pricing.rb', line 71

def total_price(configuration)
  raise(MissingPricingConfigurationElement) if configuration.keys.to_set != default_defaults.keys.to_set

  cost = pricing[:base_cost]
  configuration.each do |attribute, quantity|
    price = pricing[secrets_key_for_attribute(attribute)]
    cost += price * quantity * scaling_modifier(attribute, configuration)
  end

  raise(InvalidNegativeTotalPrice) if cost.negative?

  cost
end