ibandit 1.1.0 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -0
- data/.rubocop_todo.yml +12 -11
- data/CHANGELOG.md +22 -0
- data/README.md +1 -1
- data/Rakefile +8 -0
- data/data/german_iban_rules.yml +262 -157
- data/data/raw/BLZ2.txt +2072 -2231
- data/data/raw/swedish_bank_lookup.yml +12 -2
- data/data/structures.yml +2 -2
- data/ibandit.gemspec +1 -1
- data/lib/ibandit/check_digit.rb +1 -1
- data/lib/ibandit/errors.rb +1 -0
- data/lib/ibandit/german_details_converter.rb +3 -3
- data/lib/ibandit/iban.rb +15 -6
- data/lib/ibandit/local_details_cleaner.rb +5 -3
- data/lib/ibandit/version.rb +1 -1
- data/spec/fixtures/germany_integration_test_cases.json +7 -1
- data/spec/fixtures/germany_unit_test_cases.json +11 -0
- data/spec/ibandit/iban_spec.rb +27 -4
- data/spec/ibandit/local_details_cleaner_spec.rb +6 -0
- metadata +8 -7
@@ -1,8 +1,10 @@
|
|
1
1
|
---
|
2
2
|
# Sources:
|
3
3
|
# - https://sv.wikipedia.org/wiki/Lista_%C3%B6ver_clearingnummer_till_svenska_banker
|
4
|
-
# - http://www.bgc.se/globalassets/dokument/tekniska-manualer/bankernaskontonummeruppbyggnad_tekniskmanual_sv.pdf
|
5
|
-
# -
|
4
|
+
# - Source before October 2020 (link now broken): http://www.bgc.se/globalassets/dokument/tekniska-manualer/bankernaskontonummeruppbyggnad_tekniskmanual_sv.pdf
|
5
|
+
# - As of 30/10/2020: https://www.bankgirot.se/globalassets/dokument/anvandarmanualer/bankernaskontonummeruppbyggnad_anvandarmanual_sv.pdf
|
6
|
+
# - Swedish Bankers' Association clearing numbers: https://www.swedishbankers.se/media/4245/1906_clearingnummer-institut.pdf
|
7
|
+
# - https://transferwise.com/gb/iban/sweden
|
6
8
|
#
|
7
9
|
# Fields:
|
8
10
|
# - Range: The range of clearing codes for this bank. Used to
|
@@ -400,6 +402,14 @@
|
|
400
402
|
:zerofill_serial_number: false
|
401
403
|
:include_clearing_code: true
|
402
404
|
:validation_scheme: '1.2'
|
405
|
+
- :range: [9770, 9779]
|
406
|
+
:bank: INTERGIRO INTL AB (PUBL)
|
407
|
+
:bank_code: 977
|
408
|
+
:clearing_code_length: 4
|
409
|
+
:serial_number_length: 17
|
410
|
+
:zerofill_serial_number: true
|
411
|
+
:include_clearing_code: false
|
412
|
+
:validation_scheme: '1.1'
|
403
413
|
- :range: [9880, 9889]
|
404
414
|
:bank: Riksgälden
|
405
415
|
:bank_code: 988
|
data/data/structures.yml
CHANGED
@@ -95,7 +95,7 @@ BE:
|
|
95
95
|
:national_id_length: 3
|
96
96
|
:bban_format: "\\d{3}\\d{7}\\d{2}"
|
97
97
|
:bank_code_format: "\\d{3}"
|
98
|
-
:account_number_format: "\\d{7}\\d{2}"
|
98
|
+
:account_number_format: "\\d{7}\\d{2}\\d{3}"
|
99
99
|
:local_check_digit_position: 15
|
100
100
|
:local_check_digit_length: 2
|
101
101
|
BG:
|
@@ -902,7 +902,7 @@ US:
|
|
902
902
|
:branch_code_length: 0
|
903
903
|
:account_number_length: 17
|
904
904
|
:bank_code_format: "\\d{9}"
|
905
|
-
:account_number_format: "
|
905
|
+
:account_number_format: "_*\\d{1,17}"
|
906
906
|
:national_id_length: 9
|
907
907
|
:pseudo_iban_bank_code_length: 9
|
908
908
|
:pseudo_iban_branch_code_length: 0
|
data/ibandit.gemspec
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require File.expand_path("lib/ibandit/version", __dir__)
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
|
-
gem.add_development_dependency "gc_ruboconfig", "~> 2.
|
6
|
+
gem.add_development_dependency "gc_ruboconfig", "~> 2.20.0"
|
7
7
|
gem.add_development_dependency "nokogiri", "~> 1.6"
|
8
8
|
gem.add_development_dependency "pry", "~> 0.10"
|
9
9
|
gem.add_development_dependency "pry-nav", "~> 0.2"
|
data/lib/ibandit/check_digit.rb
CHANGED
data/lib/ibandit/errors.rb
CHANGED
@@ -307,7 +307,7 @@ module Ibandit
|
|
307
307
|
end
|
308
308
|
|
309
309
|
def sum_of_weighted_values
|
310
|
-
weighted_values.
|
310
|
+
weighted_values.sum
|
311
311
|
end
|
312
312
|
|
313
313
|
def weighted_values
|
@@ -550,7 +550,7 @@ module Ibandit
|
|
550
550
|
end
|
551
551
|
|
552
552
|
def sum_of_weighted_digits
|
553
|
-
weighted_digits.
|
553
|
+
weighted_digits.sum
|
554
554
|
end
|
555
555
|
|
556
556
|
def weighted_digits
|
@@ -1045,7 +1045,7 @@ module Ibandit
|
|
1045
1045
|
end
|
1046
1046
|
end
|
1047
1047
|
|
1048
|
-
class Rule004901 <
|
1048
|
+
class Rule004901 < Rule000000
|
1049
1049
|
# Rule 0049 01 is actually about modulus checking, not IBAN construction
|
1050
1050
|
end
|
1051
1051
|
|
data/lib/ibandit/iban.rb
CHANGED
@@ -9,7 +9,8 @@ module Ibandit
|
|
9
9
|
:swift_account_number, :source
|
10
10
|
|
11
11
|
def initialize(argument)
|
12
|
-
|
12
|
+
case argument
|
13
|
+
when String
|
13
14
|
input = argument.to_s.gsub(/\s+/, "").upcase
|
14
15
|
|
15
16
|
pseudo_iban_splitter = PseudoIBANSplitter.new(input)
|
@@ -24,7 +25,7 @@ module Ibandit
|
|
24
25
|
@iban = input
|
25
26
|
extract_swift_details_from_iban!
|
26
27
|
end
|
27
|
-
|
28
|
+
when Hash
|
28
29
|
@source = :local_details
|
29
30
|
build_iban_from_local_details(argument)
|
30
31
|
else
|
@@ -225,7 +226,7 @@ module Ibandit
|
|
225
226
|
return unless valid_country_code?
|
226
227
|
return unless structure[:bban_format]
|
227
228
|
|
228
|
-
if bban&.match?(
|
229
|
+
if bban&.match?(entire_string_regex(structure[:bban_format]))
|
229
230
|
true
|
230
231
|
else
|
231
232
|
@errors[:format] = Ibandit.translate(:invalid_format,
|
@@ -238,7 +239,9 @@ module Ibandit
|
|
238
239
|
return unless valid_bank_code_length?
|
239
240
|
return true if structure[:bank_code_length]&.zero?
|
240
241
|
|
241
|
-
if swift_bank_code&.match?(
|
242
|
+
if swift_bank_code&.match?(
|
243
|
+
entire_string_regex(structure[:bank_code_format]),
|
244
|
+
)
|
242
245
|
true
|
243
246
|
else
|
244
247
|
@errors[:bank_code] = Ibandit.translate(:is_invalid)
|
@@ -250,7 +253,9 @@ module Ibandit
|
|
250
253
|
return unless valid_branch_code_length?
|
251
254
|
return true unless structure[:branch_code_format]
|
252
255
|
|
253
|
-
if swift_branch_code&.match?(
|
256
|
+
if swift_branch_code&.match?(
|
257
|
+
entire_string_regex(structure[:branch_code_format]),
|
258
|
+
)
|
254
259
|
true
|
255
260
|
else
|
256
261
|
@errors[:branch_code] = Ibandit.translate(:is_invalid)
|
@@ -262,7 +267,7 @@ module Ibandit
|
|
262
267
|
return unless valid_account_number_length?
|
263
268
|
|
264
269
|
if swift_account_number&.match?(
|
265
|
-
|
270
|
+
entire_string_regex(structure[:account_number_format]),
|
266
271
|
)
|
267
272
|
true
|
268
273
|
else
|
@@ -499,6 +504,10 @@ module Ibandit
|
|
499
504
|
Ibandit.structures[country_code]
|
500
505
|
end
|
501
506
|
|
507
|
+
def entire_string_regex(pattern)
|
508
|
+
Regexp.new("\\A#{pattern}\\z")
|
509
|
+
end
|
510
|
+
|
502
511
|
def formatted
|
503
512
|
iban.to_s.gsub(/(.{4})/, '\1 ').strip
|
504
513
|
end
|
@@ -89,7 +89,9 @@ module Ibandit
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def self.clean_ca_details(local_details)
|
92
|
-
|
92
|
+
account_number = local_details[:account_number].tr("-", "")
|
93
|
+
|
94
|
+
return {} if account_number.length < 7 # minimum length
|
93
95
|
|
94
96
|
bank_code = if local_details[:bank_code].length == 3
|
95
97
|
local_details[:bank_code].rjust(4, "0")
|
@@ -98,7 +100,7 @@ module Ibandit
|
|
98
100
|
end
|
99
101
|
|
100
102
|
{
|
101
|
-
account_number:
|
103
|
+
account_number: account_number.rjust(12, "0"),
|
102
104
|
bank_code: bank_code,
|
103
105
|
}
|
104
106
|
end
|
@@ -512,7 +514,7 @@ module Ibandit
|
|
512
514
|
bank_code = local_details[:bank_code]
|
513
515
|
account_number = local_details[:account_number]
|
514
516
|
else
|
515
|
-
cleaned_acct_number = local_details[:account_number].gsub(
|
517
|
+
cleaned_acct_number = local_details[:account_number].gsub(/\s/, "")
|
516
518
|
|
517
519
|
bank_code = cleaned_acct_number.slice(2, 8)
|
518
520
|
account_number = cleaned_acct_number[10..-1]
|
data/lib/ibandit/version.rb
CHANGED
@@ -134,7 +134,7 @@
|
|
134
134
|
{
|
135
135
|
"convertor": "001400",
|
136
136
|
"valid": [
|
137
|
-
{ "bank_code": "
|
137
|
+
{ "bank_code": "30060601", "account_number": "60624", "converted_bank_code": "30060601" }
|
138
138
|
]
|
139
139
|
},
|
140
140
|
{
|
@@ -160,6 +160,12 @@
|
|
160
160
|
"valid": [
|
161
161
|
{ "bank_code": "39060180", "account_number": "556", "converted_account_number": "0120440110" }
|
162
162
|
]
|
163
|
+
},
|
164
|
+
{
|
165
|
+
"convertor": "004901",
|
166
|
+
"valid": [
|
167
|
+
{ "bank_code": "30060010", "account_number": "12345678", "converted_account_number": "12345678" }
|
168
|
+
]
|
163
169
|
}
|
164
170
|
// {
|
165
171
|
// "convertor": "001900",
|
@@ -435,5 +435,16 @@
|
|
435
435
|
"valid": [
|
436
436
|
{ "bank_code": "10010010", "account_number" : "1234567890", "converted_bank_code": "66010200" }
|
437
437
|
]
|
438
|
+
},
|
439
|
+
{
|
440
|
+
"convertor": "004901",
|
441
|
+
"valid": [
|
442
|
+
{
|
443
|
+
"bank_code": "30060010",
|
444
|
+
"account_number": "1234567890",
|
445
|
+
"converted_bank_code": "30060010",
|
446
|
+
"converted_account_number": "1234567890"
|
447
|
+
}
|
448
|
+
]
|
438
449
|
}
|
439
450
|
]
|
data/spec/ibandit/iban_spec.rb
CHANGED
@@ -112,6 +112,22 @@ describe Ibandit::IBAN do
|
|
112
112
|
its(:local_check_digits) { is_expected.to be_nil }
|
113
113
|
end
|
114
114
|
|
115
|
+
context "when the IBAN was created from a Belgian IBAN" do
|
116
|
+
let(:iban_code) { "BE62510007547061" }
|
117
|
+
|
118
|
+
its(:country_code) { is_expected.to eq("BE") }
|
119
|
+
its(:bank_code) { is_expected.to eq("510") }
|
120
|
+
its(:branch_code) { is_expected.to be_nil }
|
121
|
+
its(:account_number) { is_expected.to eq("510007547061") }
|
122
|
+
its(:account_number_suffix) { is_expected.to be_nil }
|
123
|
+
its(:swift_bank_code) { is_expected.to eq("510") }
|
124
|
+
its(:swift_branch_code) { is_expected.to be_nil }
|
125
|
+
its(:swift_account_number) { is_expected.to eq("510007547061") }
|
126
|
+
its(:swift_national_id) { is_expected.to eq("510") }
|
127
|
+
its(:local_check_digits) { is_expected.to eq("61") }
|
128
|
+
its(:bban) { is_expected.to eq("510007547061") }
|
129
|
+
end
|
130
|
+
|
115
131
|
context "when the IBAN was created with local details" do
|
116
132
|
let(:arg) do
|
117
133
|
{
|
@@ -452,6 +468,13 @@ describe Ibandit::IBAN do
|
|
452
468
|
its(:to_s) { is_expected.to eq("") }
|
453
469
|
end
|
454
470
|
|
471
|
+
context "and account number has invalid characters in" do
|
472
|
+
let(:account_number) { "123456XX789" }
|
473
|
+
let(:bank_code) { "0036" }
|
474
|
+
|
475
|
+
its(:valid?) { is_expected.to be false }
|
476
|
+
end
|
477
|
+
|
455
478
|
context "and a 12 digit account number" do
|
456
479
|
let(:account_number) { "012345678900" }
|
457
480
|
let(:bank_code) { "0036" }
|
@@ -2247,16 +2270,16 @@ describe Ibandit::IBAN do
|
|
2247
2270
|
|
2248
2271
|
context "with an invalid branch code" do
|
2249
2272
|
let(:iban_code) { "GB60BARC20000055779911" }
|
2273
|
+
let(:valid_bank_code) { true }
|
2274
|
+
let(:valid_branch_code) { false }
|
2275
|
+
let(:valid_account_number) { true }
|
2276
|
+
|
2250
2277
|
before { Ibandit.bic_finder = double(call: "BARCGB22XXX") }
|
2251
2278
|
|
2252
2279
|
after { Ibandit.bic_finder = nil }
|
2253
2280
|
|
2254
2281
|
before { iban.valid_local_modulus_check? }
|
2255
2282
|
|
2256
|
-
let(:valid_bank_code) { true }
|
2257
|
-
let(:valid_branch_code) { false }
|
2258
|
-
let(:valid_account_number) { true }
|
2259
|
-
|
2260
2283
|
it "calls valid_branch_code? with an IBAN object" do
|
2261
2284
|
expect(Ibandit.modulus_checker).
|
2262
2285
|
to receive(:valid_branch_code?).
|
@@ -167,6 +167,12 @@ describe Ibandit::LocalDetailsCleaner do
|
|
167
167
|
its([:country_code]) { is_expected.to eq(country_code) }
|
168
168
|
its([:bank_code]) { is_expected.to eq("0036") }
|
169
169
|
its([:branch_code]) { is_expected.to eq("00063") }
|
170
|
+
|
171
|
+
context "with a hyphen" do
|
172
|
+
let(:account_number) { "0123456-789" }
|
173
|
+
|
174
|
+
its([:account_number]) { is_expected.to eq("000123456789") }
|
175
|
+
end
|
170
176
|
end
|
171
177
|
|
172
178
|
context "Cyprus" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ibandit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GoCardless
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gc_ruboconfig
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.20.0
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: 2.20.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: nokogiri
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -153,6 +153,7 @@ files:
|
|
153
153
|
- Gemfile
|
154
154
|
- LICENSE
|
155
155
|
- README.md
|
156
|
+
- Rakefile
|
156
157
|
- TODO.md
|
157
158
|
- bin/build_german_iban_rules.rb
|
158
159
|
- bin/build_structure_file.rb
|
@@ -208,7 +209,7 @@ homepage: https://github.com/gocardless/ibandit
|
|
208
209
|
licenses:
|
209
210
|
- MIT
|
210
211
|
metadata: {}
|
211
|
-
post_install_message:
|
212
|
+
post_install_message:
|
212
213
|
rdoc_options: []
|
213
214
|
require_paths:
|
214
215
|
- lib
|
@@ -224,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
224
225
|
version: '0'
|
225
226
|
requirements: []
|
226
227
|
rubygems_version: 3.0.3
|
227
|
-
signing_key:
|
228
|
+
signing_key:
|
228
229
|
specification_version: 4
|
229
230
|
summary: Convert national banking details into IBANs, and vice-versa.
|
230
231
|
test_files: []
|