Class: ActiveMerchant::Billing::Check

Inherits:
Model
  • Object
show all
Defined in:
lib/active_merchant/billing/check.rb

Overview

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.

Constant Summary collapse

CAN_INSTITUTION_NUMBERS =

Canadian Institution Numbers Partial list found here: en.wikipedia.org/wiki/Routing_number_(Canada)

%w(
  001 002 003 004 006 010 016 030 039 117 127 177 219 245 260 269 270 308
  309 310 315 320 338 340 509 540 608 614 623 809 815 819 828 829 837 839
  865 879 889 899 241 242 248 250 265 275 277 290 294 301 303 307 311 314
  321 323 327 328 330 332 334 335 342 343 346 352 355 361 362 366 370 372
  376 378 807 853 890
)

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Model

#initialize

Methods included from ActiveMerchant::Billing::Compatibility::Model

#errors, #valid?

Constructor Details

This class inherits a constructor from ActiveMerchant::Billing::Model

Instance Attribute Details

#account_holder_typeObject

Returns the value of attribute account_holder_type.


9
10
11
# File 'lib/active_merchant/billing/check.rb', line 9

def 
  @account_holder_type
end

#account_numberObject

Returns the value of attribute account_number.


9
10
11
# File 'lib/active_merchant/billing/check.rb', line 9

def 
  @account_number
end

#account_typeObject

Returns the value of attribute account_type.


9
10
11
# File 'lib/active_merchant/billing/check.rb', line 9

def 
  @account_type
end

#bank_nameObject

Returns the value of attribute bank_name.


9
10
11
# File 'lib/active_merchant/billing/check.rb', line 9

def bank_name
  @bank_name
end

#first_nameObject

Returns the value of attribute first_name.


9
10
11
# File 'lib/active_merchant/billing/check.rb', line 9

def first_name
  @first_name
end

#institution_numberObject

Used for Canadian bank accounts


14
15
16
# File 'lib/active_merchant/billing/check.rb', line 14

def institution_number
  @institution_number
end

#last_nameObject

Returns the value of attribute last_name.


9
10
11
# File 'lib/active_merchant/billing/check.rb', line 9

def last_name
  @last_name
end

#numberObject

Returns the value of attribute number.


9
10
11
# File 'lib/active_merchant/billing/check.rb', line 9

def number
  @number
end

#routing_numberObject

Returns the value of attribute routing_number.


9
10
11
# File 'lib/active_merchant/billing/check.rb', line 9

def routing_number
  @routing_number
end

#transit_numberObject

Used for Canadian bank accounts


14
15
16
# File 'lib/active_merchant/billing/check.rb', line 14

def transit_number
  @transit_number
end

Instance Method Details

#credit_card?Boolean

Returns:

  • (Boolean)

59
60
61
# File 'lib/active_merchant/billing/check.rb', line 59

def credit_card?
  false
end

#nameObject


26
27
28
# File 'lib/active_merchant/billing/check.rb', line 26

def name
  @name ||= "#{first_name} #{last_name}".strip
end

#name=(value) ⇒ Object


30
31
32
33
34
35
36
37
# File 'lib/active_merchant/billing/check.rb', line 30

def name=(value)
  return if empty?(value)

  @name = value
  segments = value.split(' ')
  @last_name = segments.pop
  @first_name = segments.join(' ')
end

#typeObject


55
56
57
# File 'lib/active_merchant/billing/check.rb', line 55

def type
  'check'
end

#valid_routing_number?Boolean

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

Returns:

  • (Boolean)

67
68
69
70
71
72
73
74
75
76
77
# File 'lib/active_merchant/billing/check.rb', line 67

def valid_routing_number?
  digits = routing_number.to_s.split('').map(&:to_i).select { |d| (0..9).cover?(d) }
  if digits.size == 9
    checksum = ((3 * (digits[0] + digits[3] + digits[6])) +
      (7 * (digits[1] + digits[4] + digits[7])) +
      (digits[2] + digits[5] + digits[8])) % 10

    return checksum == 0 || CAN_INSTITUTION_NUMBERS.include?(routing_number[1..3])
  end
  false
end

#validateObject


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/active_merchant/billing/check.rb', line 39

def validate
  errors = []

  %i[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?

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

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

  errors_hash(errors)
end