class CCBill::DynamicPricing

Attributes

config[RW]
errors[RW]
variables[RW]

Public Class Methods

new(options = {}) click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 7
def initialize(options = {})
  self.config = CCBill.configuration

  fail_on_price_set(options)

  modified_options = modify_params(options)

  self.variables = {
    account:        config.account,
    sub_account:    config.sub_account,
    currency_code:  config.default_currency
  }.merge(modified_options)
end

Public Instance Methods

url() click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 21
def url
  raise DynamicPricingError.new(self.errors.join(' ')) if !valid?

  variables[:form_digest] = encode_form_digest

  config.endpoint + config.flexform_id + '?' + URI.encode_www_form(transformed_variables)
end
valid?() click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 29
def valid?
  self.errors = []

  required_fields.each do |field|
    self.errors << "#{field} is required." if !variables[field]
  end

  unless (config.min_price.to_f..config.max_price.to_f).include?(variables[:initial_price].to_f)
    self.errors << "Initial price must be between $#{config.min_price} and $#{config.max_price}."
  end

  if recurring?
    unless (config.min_price.to_f..config.max_price.to_f).include?(variables[:recurring_price].to_f)
      self.errors << "Recurring price must be between $#{config.min_price} and $#{config.max_price}."
    end
  end

  self.errors.empty?
end

Private Instance Methods

ccbill_field(internal) click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 95
def ccbill_field(internal)
  {
    account:          'clientAccnum',
    sub_account:      'clientSubacc',
    initial_price:    'initialPrice',
    initial_period:   'initialPeriod',
    currency_code:    'currencyCode',
    recurring_price:  'recurringPrice',
    recurring_period: 'recurringPeriod',
    num_rebills:      'numRebills',
    form_digest:      'formDigest'
  }[internal] || internal
end
convert_to_price(cents) click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 133
def convert_to_price(cents)
  '%.2f' % (cents / 100.to_f)
end
encode_form_digest() click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 51
def encode_form_digest
  hashed_fields = if recurring?
    [
      variables[:initial_price],
      variables[:initial_period],
      variables[:recurring_price],
      variables[:recurring_period],
      variables[:num_rebills],
      variables[:currency_code],
      config.salt
    ]
  else
    [
      variables[:initial_price],
      variables[:initial_period],
      variables[:currency_code],
      config.salt
    ]
  end

  Digest::MD5.hexdigest(hashed_fields.join)
end
fail_on_price_set(options) click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 137
def fail_on_price_set(options)
  compared_array = [:initial_price, :recurring_price] & options.keys
  if compared_array.any?
    array_with_cents = compared_array.map{|word| word.to_s + '_in_cents' }.join(', ')

    fail SyntaxError, "You misspelled! Gem uses #{array_with_cents} value(s)."
  end
end
modify_params(options) click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 123
def modify_params(options)
  initial_cents = options.delete(:initial_price_in_cents)
  options[:initial_price] = convert_to_price(initial_cents) if initial_cents

  recurring_cents = options.delete(:recurring_price_in_cents)
  options[:recurring_price] = convert_to_price(recurring_cents) if recurring_cents

  options
end
recurring?() click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 74
def recurring?
  variables[:recurring_price] || variables[:recurring_period] || variables[:num_rebills]
end
required_fields() click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 78
def required_fields
  req = [
    :initial_price,
    :initial_period
  ]

  if recurring?
    req += [
      :recurring_price,
      :recurring_period,
      :num_rebills
    ]
  end

  req
end
transform_keys(_hash) { |key| ... } click to toggle source

From Active Support:

# File lib/ccbill_ruby/dynamic_pricing.rb, line 114
def transform_keys(_hash)
  result = {}
  _hash.keys.each do |key|
    result[yield(key)] = _hash[key]
  end
  result
end
transformed_variables() click to toggle source
# File lib/ccbill_ruby/dynamic_pricing.rb, line 109
def transformed_variables
  transform_keys(variables) { |key| ccbill_field(key) }
end