Module: ActiveMerchant::Billing::CreditCardMethods::ClassMethods

Defined in:
lib/active_merchant/billing/credit_card_methods.rb

Instance Method Summary collapse

Instance Method Details

#brand?(number) ⇒ Boolean

Returns a string containing the brand of card from the list of known information below. Need to check the cards in a particular order, as there is some overlap of the allowable ranges – TODO Refactor this method. We basically need to tighten up the Maestro Regexp.

Right now the Maestro regexp overlaps with the MasterCard regexp (IIRC). If we can tighten things up, we can boil this whole thing down to something like…

def brand?(number)
  return 'visa' if valid_test_mode_card_number?(number)
  card_companies.find([nil]) { |brand, regexp| number =~ regexp }.first.dup
end

Returns:

  • (Boolean)


128
129
130
131
132
133
134
135
136
137
138
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 128

def brand?(number)
  return 'bogus' if valid_test_mode_card_number?(number)

  card_companies.reject { |c,p| c == 'maestro' }.each do |company, pattern|
    return company.dup if number =~ pattern
  end

  return 'maestro' if number =~ card_companies['maestro']

  return nil
end

#card_companiesObject



111
112
113
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 111

def card_companies
  CARD_COMPANIES
end

#electron?(number) ⇒ Boolean

Returns:

  • (Boolean)


140
141
142
143
144
145
146
147
148
149
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 140

def electron?(number)
  return false unless [16, 19].include?(number.length)

  # don't recalculate for each range
  bank_identification_number = first_digits(number).to_i

  ELECTRON_RANGES.any? do |range|
    range.include?(bank_identification_number)
  end
end

#first_digits(number) ⇒ Object



156
157
158
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 156

def first_digits(number)
  number.to_s.slice(0,6)
end

#last_digits(number) ⇒ Object



160
161
162
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 160

def last_digits(number)
  number.to_s.length <= 4 ? number : number.to_s.slice(-4..-1)
end

#mask(number) ⇒ Object



164
165
166
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 164

def mask(number)
  "XXXX-XXXX-XXXX-#{last_digits(number)}"
end

#matching_brand?(number, brand) ⇒ Boolean

Checks to see if the calculated brand matches the specified brand

Returns:

  • (Boolean)


169
170
171
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 169

def matching_brand?(number, brand)
  brand?(number) == brand
end

#matching_type?(number, brand) ⇒ Boolean

Returns:

  • (Boolean)


173
174
175
176
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 173

def matching_type?(number, brand)
  ActiveMerchant.deprecated 'CreditCard#matching_type? is deprecated and will be removed from a future release of ActiveMerchant. Please use CreditCard#matching_brand? instead.'
  matching_brand?(number, brand)
end

#type?(number) ⇒ Boolean

Returns:

  • (Boolean)


151
152
153
154
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 151

def type?(number)
  ActiveMerchant.deprecated 'CreditCard#type? is deprecated and will be removed from a future release of ActiveMerchant. Please use CreditCard#brand? instead.'
  brand?(number)
end

#valid_number?(number) ⇒ Boolean

Returns true if it validates. Optionally, you can pass a card brand as an argument and make sure it is of the correct brand.

References:

Returns:

  • (Boolean)


99
100
101
102
103
104
# File 'lib/active_merchant/billing/credit_card_methods.rb', line 99

def valid_number?(number)
  valid_test_mode_card_number?(number) ||
    valid_card_number_length?(number) &&
    valid_card_number_characters?(number) &&
    valid_checksum?(number)
end