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
|
.packages ⇒ Object
23
24
25
|
# File 'lib/satorix/common/pricing.rb', line 23
def packages
overrides.keys
end
|
.pricing ⇒ Object
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/satorix/common/pricing.rb', line 28
def pricing
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_attributes ⇒ Object
92
93
94
95
96
|
# File 'lib/satorix/common/pricing.rb', line 92
def scaled_attributes
{ 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
|