lib/banktools-se/account.rb in banktools-se-0.8.0 vs lib/banktools-se/account.rb in banktools-se-0.10.0
- old
+ new
@@ -1,59 +1,17 @@
# encoding: utf-8
+# http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG910.pdf
+
+require "banktools-se/account/clearing_number"
+
module BankTools
module SE
class Account
-
- # http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG910.pdf
-
DEFAULT_SERIAL_NUMBER_LENGTH = 7
+ CLEARING_NUMBER_MAP = ClearingNumber::MAP
- CLEARING_NUMBER_MAP = {
- 1100..1199 => { :name => "Nordea" },
- 1200..1399 => { :name => "Danske Bank" },
- 1400..2099 => { :name => "Nordea" },
- 2300..2399 => { :name => "Ålandsbanken" },
- 2400..2499 => { :name => "Danske Bank" },
- 3000..3299 => { :name => "Nordea" },
- 3300..3300 => { :name => "Nordea", :serial_number_length => 10, :luhn_for_serial => true }, # Personkonto.
- 3301..3399 => { :name => "Nordea" },
- 3400..3409 => { :name => "Länsförsäkringar Bank" },
- 3410..3781 => { :name => "Nordea" },
- 3782..3782 => { :name => "Nordea", :serial_number_length => 10, :luhn_for_serial => true }, # Personkonto.
- 3783..4999 => { :name => "Nordea" },
- 5000..5999 => { :name => "SEB" },
- 6000..6999 => { :name => "Handelsbanken", :serial_number_length => 9 },
- 7000..7999 => { :name => "Swedbank" },
- # Can be fewer chars but must be zero-filled, so let's call it 10.
- 8000..8999 => { :name => "Swedbank", :serial_number_length => 10, :checksum_for_clearing => true, :zerofill => true },
- 9020..9029 => { :name => "Länsförsäkringar Bank" },
- 9040..9049 => { :name => "Citibank" },
- 9060..9069 => { :name => "Länsförsäkringar Bank" },
- 9090..9099 => { :name => "Royal Bank of Scotland" },
- 9100..9109 => { :name => "Nordnet Bank" },
- 9120..9124 => { :name => "SEB" },
- 9130..9149 => { :name => "SEB" },
- 9150..9169 => { :name => "Skandiabanken" },
- 9170..9179 => { :name => "Ikano Bank" },
- 9180..9189 => { :name => "Danske Bank", :serial_number_length => 10 },
- 9190..9199 => { :name => "Den Norske Bank" },
- 9230..9239 => { :name => "Marginalen Bank" },
- 9250..9259 => { :name => "SBAB" },
- 9260..9269 => { :name => "Den Norske Bank" },
- 9270..9279 => { :name => "ICA Banken" },
- 9280..9289 => { :name => "Resurs Bank" },
- 9300..9349 => { :name => "Sparbanken Öresund", :serial_number_length => 10, :zerofill => true },
- 9400..9449 => { :name => "Forex Bank" },
- 9460..9469 => { :name => "GE Money Bank" },
- 9470..9479 => { :name => "Fortis Bank" },
- 9500..9549 => { :name => "Nordea/Plusgirot", :serial_number_length => 1..10 },
- 9550..9569 => { :name => "Avanza Bank" },
- 9570..9579 => { :name => "Sparbanken Syd", :serial_number_length => 10, :zerofill => true},
- 9960..9969 => { :name => "Nordea/Plusgirot", :serial_number_length => 1..10 },
- }
-
attr_reader :number
def initialize(number)
@number = number
end
@@ -65,14 +23,14 @@
def errors
errors = []
errors << Errors::TOO_SHORT if serial_number.length < min_length
errors << Errors::TOO_LONG if serial_number.length > max_length
- errors << Errors::INVALID_CHARACTERS if number.to_s.match(/[^0-9 -]/)
+ errors << Errors::INVALID_CHARACTERS if number.to_s.match(/[^\d -]/)
if luhn_for_serial?
- errors << Errors::BAD_CHECKSUM unless BankTools::SE::Utils.valid_luhn?(serial_number)
+ errors << Errors::BAD_CHECKSUM unless Utils.valid_luhn?(serial_number)
end
errors << Errors::UNKNOWN_CLEARING_NUMBER unless bank
errors
@@ -97,44 +55,51 @@
].compact.join("-")
end
def serial_number
number = digits.slice(clearing_number_length..-1) || ""
- zerofill? ? "%.#{bank_data[:serial_number_length]}d" % number.to_i(10) : number
+
+ if zerofill?
+ number.rjust(serial_number_length, "0")
+ else
+ number
+ end
end
private
def clearing_number_length
checksum_for_clearing? ? 5 : 4
end
def bank_data
number = digits[0,4].to_i
- _, found_data = CLEARING_NUMBER_MAP.find do |interval, data|
- interval.include?(number)
- end
+ _, found_data = CLEARING_NUMBER_MAP.find { |interval, data| interval.include?(number) }
found_data || {}
end
def min_length
if bank_data
- Array(bank_data[:serial_number_length] || DEFAULT_SERIAL_NUMBER_LENGTH).first
+ Array(serial_number_length).first
else
0
end
end
def max_length
if bank_data
- Array(bank_data[:serial_number_length] || DEFAULT_SERIAL_NUMBER_LENGTH).last +
+ Array(serial_number_length).last +
(checksum_for_clearing? ? 1 : 0)
else
1/0.0 # Infinity.
end
end
+ def serial_number_length
+ bank_data.fetch(:serial_number_length, DEFAULT_SERIAL_NUMBER_LENGTH)
+ end
+
def luhn_for_serial?
bank_data[:luhn_for_serial]
end
def checksum_for_clearing?
@@ -146,9 +111,8 @@
end
def zerofill?
!!bank_data[:zerofill]
end
-
end
end
end