class ActiveMerchant::Billing::Check

The Check object is a plain old Ruby object, similar to CreditCard. It supports validation of necessary attributes such as checkholder’s name, routing and account numbers, but it is not backed by any database.

You may use Check in place of CreditCard with any gateway that supports it.

Attributes

account_holder_type[RW]
account_number[RW]
account_type[RW]
bank_name[RW]
first_name[RW]
institution_number[RW]

Used for Canadian bank accounts

last_name[RW]
number[RW]
routing_number[RW]
transit_number[RW]

Used for Canadian bank accounts

Public Instance Methods

name() click to toggle source
# File lib/active_merchant/billing/check.rb, line 16
def name
  @name ||= "#{first_name} #{last_name}".strip
end
name=(value) click to toggle source
# File lib/active_merchant/billing/check.rb, line 20
def name=(value)
  return if empty?(value)

  @name = value
  segments = value.split(' ')
  @last_name = segments.pop
  @first_name = segments.join(' ')
end
type() click to toggle source
# File lib/active_merchant/billing/check.rb, line 49
def type
  'check'
end
valid_routing_number?() click to toggle source

Routing numbers may be validated by calculating a checksum and dividing it by 10. The formula is:

(3(d1 + d4 + d7) + 7(d2 + d5 + d8) + 1(d3 + d6 + d9))mod 10 = 0

See en.wikipedia.org/wiki/Routing_transit_number#Internal_checksums

# File lib/active_merchant/billing/check.rb, line 57
def valid_routing_number?
  digits = routing_number.to_s.split('').map(&:to_i).select{|d| (0..9).include?(d)}
  case digits.size
  when 9
    checksum = ((3 * (digits[0] + digits[3] + digits[6])) +
                (7 * (digits[1] + digits[4] + digits[7])) +
                     (digits[2] + digits[5] + digits[8])) % 10
    case checksum
    when 0
      true
    else
      false
    end
  else
    false
  end
end
validate() click to toggle source
# File lib/active_merchant/billing/check.rb, line 29
def validate
  errors = []

  [:name, :routing_number, :account_number].each do |attr|
    errors << [attr, "cannot be empty"] if empty?(self.send(attr))
  end

  errors << [:routing_number, "is invalid"] unless valid_routing_number?

  if(!empty?(account_holder_type) && !%w[business personal].include?(account_holder_type.to_s))
    errors << [:account_holder_type, "must be personal or business"]
  end

  if(!empty?(account_type) && !%w[checking savings].include?(account_type.to_s))
    errors << [:account_type, "must be checking or savings"]
  end

  errors_hash(errors)
end