ibandit 0.11.6 → 0.11.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -6
- data/.rubocop_todo.yml +4 -0
- data/CHANGELOG.md +4 -0
- data/Gemfile +8 -0
- data/README.md +90 -30
- data/data/structures.yml +9 -0
- data/ibandit.gemspec +23 -19
- data/lib/ibandit.rb +18 -18
- data/lib/ibandit/check_digit.rb +8 -8
- data/lib/ibandit/constants.rb +14 -5
- data/lib/ibandit/german_details_converter.rb +598 -598
- data/lib/ibandit/iban.rb +90 -37
- data/lib/ibandit/iban_assembler.rb +15 -13
- data/lib/ibandit/iban_splitter.rb +4 -4
- data/lib/ibandit/local_details_cleaner.rb +94 -85
- data/lib/ibandit/pseudo_iban_assembler.rb +2 -2
- data/lib/ibandit/pseudo_iban_splitter.rb +15 -25
- data/lib/ibandit/sweden/bank_lookup.rb +1 -1
- data/lib/ibandit/sweden/local_details_converter.rb +7 -7
- data/lib/ibandit/sweden/validator.rb +5 -5
- data/lib/ibandit/version.rb +1 -1
- data/spec/ibandit/german_details_converter_spec.rb +23 -22
- data/spec/ibandit/iban_assembler_spec.rb +310 -310
- data/spec/ibandit/iban_spec.rb +1087 -712
- data/spec/ibandit/iban_splitter_spec.rb +14 -14
- data/spec/ibandit/local_details_cleaner_spec.rb +473 -452
- data/spec/ibandit/pseudo_iban_assembler_spec.rb +54 -18
- data/spec/ibandit/pseudo_iban_splitter_spec.rb +13 -22
- data/spec/ibandit/structure_spec.rb +3 -3
- data/spec/ibandit/sweden/local_details_converter_spec.rb +125 -125
- data/spec/ibandit/sweden/validator_spec.rb +88 -88
- data/spec/spec_helper.rb +10 -10
- metadata +48 -20
data/lib/ibandit/iban.rb
CHANGED
@@ -1,26 +1,32 @@
|
|
1
|
-
require
|
1
|
+
require "yaml"
|
2
2
|
|
3
3
|
module Ibandit
|
4
4
|
class IBAN
|
5
5
|
attr_reader :errors, :iban, :country_code, :check_digits, :bank_code,
|
6
6
|
:branch_code, :account_number, :swift_bank_code,
|
7
|
-
:swift_branch_code, :swift_account_number
|
7
|
+
:swift_branch_code, :swift_account_number, :source
|
8
8
|
|
9
9
|
def initialize(argument)
|
10
10
|
if argument.is_a?(String)
|
11
|
-
input = argument.to_s.gsub(/\s+/,
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
input = argument.to_s.gsub(/\s+/, "").upcase
|
12
|
+
|
13
|
+
pseudo_iban_splitter = PseudoIBANSplitter.new(input)
|
14
|
+
is_pseudo_iban_country = Constants::PSEUDO_IBAN_COUNTRY_CODES.
|
15
|
+
include?(pseudo_iban_splitter.country_code)
|
16
|
+
if pseudo_iban?(input) && is_pseudo_iban_country
|
17
|
+
@source = :pseudo_iban
|
18
|
+
local_details = pseudo_iban_splitter.split
|
15
19
|
build_iban_from_local_details(local_details)
|
16
20
|
else
|
21
|
+
@source = :iban
|
17
22
|
@iban = input
|
18
23
|
extract_swift_details_from_iban!
|
19
24
|
end
|
20
25
|
elsif argument.is_a?(Hash)
|
26
|
+
@source = :local_details
|
21
27
|
build_iban_from_local_details(argument)
|
22
28
|
else
|
23
|
-
raise TypeError,
|
29
|
+
raise TypeError, "Must pass an IBAN string or hash of local details"
|
24
30
|
end
|
25
31
|
|
26
32
|
@errors = {}
|
@@ -51,7 +57,7 @@ module Ibandit
|
|
51
57
|
|
52
58
|
iban.slice(
|
53
59
|
structure[:local_check_digit_position] - 1,
|
54
|
-
structure[:local_check_digit_length]
|
60
|
+
structure[:local_check_digit_length],
|
55
61
|
)
|
56
62
|
end
|
57
63
|
|
@@ -64,7 +70,7 @@ module Ibandit
|
|
64
70
|
country_code: country_code,
|
65
71
|
bank_code: bank_code,
|
66
72
|
branch_code: branch_code,
|
67
|
-
account_number: account_number
|
73
|
+
account_number: account_number,
|
68
74
|
).assemble
|
69
75
|
end
|
70
76
|
|
@@ -73,21 +79,27 @@ module Ibandit
|
|
73
79
|
###############
|
74
80
|
|
75
81
|
def valid?
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
]
|
82
|
+
has_iban = !iban.nil?
|
83
|
+
has_pseudo_iban = !pseudo_iban.nil?
|
84
|
+
|
85
|
+
if has_pseudo_iban && !has_iban
|
86
|
+
valid_pseudo_iban?
|
87
|
+
else
|
88
|
+
valid_iban?
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def valid_pseudo_iban_check_digits?
|
93
|
+
return true unless source == :pseudo_iban
|
94
|
+
return true if check_digits == Constants::PSEUDO_IBAN_CHECK_DIGITS
|
95
|
+
|
96
|
+
@errors[:check_digits] =
|
97
|
+
Ibandit.translate(
|
98
|
+
:invalid_check_digits,
|
99
|
+
expected_check_digits: Constants::PSEUDO_IBAN_CHECK_DIGITS,
|
100
|
+
check_digits: check_digits,
|
101
|
+
)
|
102
|
+
false
|
91
103
|
end
|
92
104
|
|
93
105
|
def valid_country_code?
|
@@ -131,8 +143,9 @@ module Ibandit
|
|
131
143
|
|
132
144
|
def valid_bank_code_length?
|
133
145
|
return unless valid_country_code?
|
146
|
+
return true if structure[:bank_code_length] == 0
|
134
147
|
|
135
|
-
if swift_bank_code.nil? || swift_bank_code.
|
148
|
+
if swift_bank_code.nil? || swift_bank_code.empty?
|
136
149
|
@errors[:bank_code] = Ibandit.translate(:is_required)
|
137
150
|
return false
|
138
151
|
end
|
@@ -153,7 +166,7 @@ module Ibandit
|
|
153
166
|
if structure[:branch_code_length] == 0
|
154
167
|
@errors[:branch_code] = Ibandit.translate(:not_used_in_country,
|
155
168
|
country_code: country_code)
|
156
|
-
elsif swift_branch_code.nil? || swift_branch_code.
|
169
|
+
elsif swift_branch_code.nil? || swift_branch_code.empty?
|
157
170
|
@errors[:branch_code] = Ibandit.translate(:is_required)
|
158
171
|
else
|
159
172
|
@errors[:branch_code] =
|
@@ -186,7 +199,7 @@ module Ibandit
|
|
186
199
|
if iban.scan(/[^A-Z0-9]/).any?
|
187
200
|
@errors[:characters] =
|
188
201
|
Ibandit.translate(:non_alphanumeric_characters,
|
189
|
-
characters: iban.scan(/[^A-Z\d]/).join(
|
202
|
+
characters: iban.scan(/[^A-Z\d]/).join(" "))
|
190
203
|
false
|
191
204
|
else
|
192
205
|
true
|
@@ -195,6 +208,7 @@ module Ibandit
|
|
195
208
|
|
196
209
|
def valid_format?
|
197
210
|
return unless valid_country_code?
|
211
|
+
return unless structure[:bban_format]
|
198
212
|
|
199
213
|
if bban =~ Regexp.new(structure[:bban_format])
|
200
214
|
true
|
@@ -207,6 +221,7 @@ module Ibandit
|
|
207
221
|
|
208
222
|
def valid_bank_code_format?
|
209
223
|
return unless valid_bank_code_length?
|
224
|
+
return true if structure[:bank_code_length] == 0
|
210
225
|
|
211
226
|
if swift_bank_code =~ Regexp.new(structure[:bank_code_format])
|
212
227
|
true
|
@@ -252,21 +267,21 @@ module Ibandit
|
|
252
267
|
return unless valid_country_code?
|
253
268
|
|
254
269
|
case country_code
|
255
|
-
when
|
256
|
-
when
|
270
|
+
when "DE" then supports_iban_determination?
|
271
|
+
when "SE" then valid_swedish_details?
|
257
272
|
else true
|
258
273
|
end
|
259
274
|
end
|
260
275
|
|
261
276
|
def supports_iban_determination?
|
262
277
|
return unless valid_format?
|
263
|
-
return true unless country_code ==
|
278
|
+
return true unless country_code == "DE"
|
264
279
|
|
265
280
|
begin
|
266
281
|
GermanDetailsConverter.convert(
|
267
282
|
country_code: country_code,
|
268
283
|
bank_code: swift_bank_code,
|
269
|
-
account_number: swift_account_number
|
284
|
+
account_number: swift_account_number,
|
270
285
|
)
|
271
286
|
true
|
272
287
|
rescue UnsupportedAccountDetails
|
@@ -276,7 +291,7 @@ module Ibandit
|
|
276
291
|
end
|
277
292
|
|
278
293
|
def valid_swedish_details?
|
279
|
-
return true unless country_code ==
|
294
|
+
return true unless country_code == "SE"
|
280
295
|
|
281
296
|
if branch_code
|
282
297
|
valid_swedish_local_details?
|
@@ -296,7 +311,7 @@ module Ibandit
|
|
296
311
|
length_valid =
|
297
312
|
Sweden::Validator.account_number_length_valid_for_bank_code?(
|
298
313
|
bank_code: swift_bank_code,
|
299
|
-
account_number: swift_account_number
|
314
|
+
account_number: swift_account_number,
|
300
315
|
)
|
301
316
|
|
302
317
|
unless length_valid
|
@@ -315,7 +330,7 @@ module Ibandit
|
|
315
330
|
|
316
331
|
valid_serial_number = Sweden::Validator.valid_serial_number_length?(
|
317
332
|
clearing_code: branch_code,
|
318
|
-
serial_number: account_number
|
333
|
+
serial_number: account_number,
|
319
334
|
)
|
320
335
|
|
321
336
|
unless valid_serial_number
|
@@ -332,6 +347,38 @@ module Ibandit
|
|
332
347
|
|
333
348
|
private
|
334
349
|
|
350
|
+
def valid_pseudo_iban?
|
351
|
+
[
|
352
|
+
valid_pseudo_iban_check_digits?,
|
353
|
+
valid_country_code?,
|
354
|
+
valid_bank_code_length?,
|
355
|
+
valid_branch_code_length?,
|
356
|
+
valid_account_number_length?,
|
357
|
+
valid_bank_code_format?,
|
358
|
+
valid_branch_code_format?,
|
359
|
+
valid_account_number_format?,
|
360
|
+
passes_country_specific_checks?,
|
361
|
+
].all?
|
362
|
+
end
|
363
|
+
|
364
|
+
def valid_iban?
|
365
|
+
[
|
366
|
+
valid_country_code?,
|
367
|
+
valid_characters?,
|
368
|
+
valid_check_digits?,
|
369
|
+
valid_length?,
|
370
|
+
valid_bank_code_length?,
|
371
|
+
valid_branch_code_length?,
|
372
|
+
valid_account_number_length?,
|
373
|
+
valid_format?,
|
374
|
+
valid_bank_code_format?,
|
375
|
+
valid_branch_code_format?,
|
376
|
+
valid_account_number_format?,
|
377
|
+
valid_local_modulus_check?,
|
378
|
+
passes_country_specific_checks?,
|
379
|
+
].all?
|
380
|
+
end
|
381
|
+
|
335
382
|
def decomposable?
|
336
383
|
[iban, country_code, swift_bank_code, swift_account_number].none?(&:nil?)
|
337
384
|
end
|
@@ -349,7 +396,12 @@ module Ibandit
|
|
349
396
|
@swift_bank_code = try_dup(local_details[:swift_bank_code])
|
350
397
|
|
351
398
|
@iban = IBANAssembler.assemble(swift_details)
|
352
|
-
|
399
|
+
|
400
|
+
if source == :pseudo_iban
|
401
|
+
@check_digits = try_dup(local_details[:check_digits])
|
402
|
+
else
|
403
|
+
@check_digits = @iban.slice(2, 2) unless @iban.nil?
|
404
|
+
end
|
353
405
|
end
|
354
406
|
|
355
407
|
def extract_swift_details_from_iban!
|
@@ -363,7 +415,7 @@ module Ibandit
|
|
363
415
|
@swift_account_number = swift_details[:account_number]
|
364
416
|
|
365
417
|
return if Constants::PSEUDO_IBAN_COUNTRY_CODES.
|
366
|
-
|
418
|
+
include?(@country_code)
|
367
419
|
|
368
420
|
@bank_code = swift_details[:bank_code]
|
369
421
|
@branch_code = swift_details[:branch_code]
|
@@ -410,11 +462,12 @@ module Ibandit
|
|
410
462
|
country_code: @country_code,
|
411
463
|
account_number: @swift_account_number,
|
412
464
|
branch_code: @swift_branch_code,
|
413
|
-
bank_code: @swift_bank_code
|
465
|
+
bank_code: @swift_bank_code,
|
414
466
|
}
|
415
467
|
end
|
416
468
|
|
417
469
|
def pseudo_iban?(input)
|
470
|
+
return false if input.nil?
|
418
471
|
input.slice(2, 2) == Constants::PSEUDO_IBAN_CHECK_DIGITS
|
419
472
|
end
|
420
473
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Ibandit
|
2
2
|
module IBANAssembler
|
3
|
-
EXCEPTION_COUNTRY_CODES = %w
|
3
|
+
EXCEPTION_COUNTRY_CODES = %w[IT SM BE].freeze
|
4
4
|
|
5
5
|
def self.assemble(local_details)
|
6
6
|
country_code = local_details[:country_code]
|
@@ -47,7 +47,7 @@ module Ibandit
|
|
47
47
|
partial_bban = [
|
48
48
|
opts[:bank_code],
|
49
49
|
opts[:branch_code],
|
50
|
-
opts[:account_number]
|
50
|
+
opts[:account_number],
|
51
51
|
].join
|
52
52
|
|
53
53
|
check_digit = opts[:check_digit] || CheckDigit.italian(partial_bban)
|
@@ -69,7 +69,8 @@ module Ibandit
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def self.supported_country_code?(local_details)
|
72
|
-
Constants::
|
72
|
+
Constants::CONSTRUCTABLE_IBAN_COUNTRY_CODES.
|
73
|
+
include?(local_details[:country_code])
|
73
74
|
end
|
74
75
|
|
75
76
|
def self.valid_arguments?(local_details)
|
@@ -86,22 +87,23 @@ module Ibandit
|
|
86
87
|
|
87
88
|
def self.required_fields(country_code)
|
88
89
|
case country_code
|
89
|
-
when
|
90
|
-
|
91
|
-
|
92
|
-
|
90
|
+
when "AT", "CY", "CZ", "DE", "DK", "EE", "FI", "HR", "IS", "LT", "LU",
|
91
|
+
"LV", "NL", "NO", "PL", "RO", "SE", "SI", "SK"
|
92
|
+
%i[bank_code account_number]
|
93
|
+
when "BE"
|
94
|
+
%i[account_number]
|
93
95
|
else
|
94
|
-
%i
|
96
|
+
%i[bank_code branch_code account_number]
|
95
97
|
end
|
96
98
|
end
|
97
99
|
|
98
100
|
def self.allowed_fields(country_code)
|
99
101
|
# Some countries have additional optional fields
|
100
102
|
case country_code
|
101
|
-
when
|
102
|
-
when
|
103
|
-
when
|
104
|
-
when
|
103
|
+
when "BE" then %i[bank_code account_number]
|
104
|
+
when "CY" then %i[bank_code branch_code account_number]
|
105
|
+
when "IT" then %i[bank_code branch_code account_number check_digit]
|
106
|
+
when "CZ", "SK" then %i[bank_code account_number account_number_prefix]
|
105
107
|
else required_fields(country_code)
|
106
108
|
end
|
107
109
|
end
|
@@ -110,7 +112,7 @@ module Ibandit
|
|
110
112
|
[
|
111
113
|
country_code,
|
112
114
|
CheckDigit.iban(country_code, bban),
|
113
|
-
bban
|
115
|
+
bban,
|
114
116
|
].join
|
115
117
|
rescue InvalidCharacterError
|
116
118
|
nil
|
@@ -6,7 +6,7 @@ module Ibandit
|
|
6
6
|
check_digits: check_digits_from(iban),
|
7
7
|
bank_code: bank_code_from(iban),
|
8
8
|
branch_code: branch_code_from(iban),
|
9
|
-
account_number: account_number_from(iban)
|
9
|
+
account_number: account_number_from(iban),
|
10
10
|
}
|
11
11
|
end
|
12
12
|
|
@@ -31,7 +31,7 @@ module Ibandit
|
|
31
31
|
|
32
32
|
iban.slice(
|
33
33
|
structure(iban)[:bank_code_position] - 1,
|
34
|
-
structure(iban)[:bank_code_length]
|
34
|
+
structure(iban)[:bank_code_length],
|
35
35
|
)
|
36
36
|
end
|
37
37
|
|
@@ -42,7 +42,7 @@ module Ibandit
|
|
42
42
|
|
43
43
|
iban.slice(
|
44
44
|
structure(iban)[:branch_code_position] - 1,
|
45
|
-
structure(iban)[:branch_code_length]
|
45
|
+
structure(iban)[:branch_code_length],
|
46
46
|
)
|
47
47
|
end
|
48
48
|
|
@@ -51,7 +51,7 @@ module Ibandit
|
|
51
51
|
|
52
52
|
iban.slice(
|
53
53
|
structure(iban)[:account_number_position] - 1,
|
54
|
-
structure(iban)[:account_number_length]
|
54
|
+
structure(iban)[:account_number_length],
|
55
55
|
)
|
56
56
|
end
|
57
57
|
|
@@ -2,13 +2,13 @@ module Ibandit
|
|
2
2
|
module LocalDetailsCleaner
|
3
3
|
def self.clean(local_details)
|
4
4
|
country_code = local_details[:country_code]
|
5
|
-
|
6
5
|
if can_clean?(country_code, local_details)
|
7
6
|
local_details = local_details.merge(
|
8
|
-
public_send(:"clean_#{country_code.downcase}_details", local_details)
|
7
|
+
public_send(:"clean_#{country_code.downcase}_details", local_details),
|
8
|
+
)
|
9
9
|
end
|
10
10
|
|
11
|
-
return local_details if explicit_swift_details?(
|
11
|
+
return local_details if explicit_swift_details?(local_details)
|
12
12
|
|
13
13
|
swift_details_for(local_details).merge(local_details)
|
14
14
|
end
|
@@ -22,8 +22,8 @@ module Ibandit
|
|
22
22
|
fields_for?(country_code, local_details)
|
23
23
|
end
|
24
24
|
|
25
|
-
def self.explicit_swift_details?(
|
26
|
-
|
25
|
+
def self.explicit_swift_details?(local_details)
|
26
|
+
local_details.include?(:swift_account_number)
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.fields_for?(country_code, opts)
|
@@ -32,16 +32,18 @@ module Ibandit
|
|
32
32
|
|
33
33
|
def self.required_fields(country_code)
|
34
34
|
case country_code
|
35
|
-
when
|
36
|
-
%i
|
37
|
-
when
|
38
|
-
%i
|
39
|
-
when
|
40
|
-
if Ibandit.bic_finder.nil? then %i
|
41
|
-
else %i
|
35
|
+
when "AT", "CY", "DE", "FI", "LT", "LU", "LV", "NL", "RO", "SI", "SK"
|
36
|
+
%i[bank_code account_number]
|
37
|
+
when "BE", "CZ", "DK", "EE", "ES", "HR", "HU", "IS", "NO", "PL", "SE"
|
38
|
+
%i[account_number]
|
39
|
+
when "GB", "IE", "MT"
|
40
|
+
if Ibandit.bic_finder.nil? then %i[bank_code branch_code account_number]
|
41
|
+
else %i[branch_code account_number]
|
42
42
|
end
|
43
|
+
when "AU"
|
44
|
+
%i[branch_code account_number]
|
43
45
|
else
|
44
|
-
%i
|
46
|
+
%i[bank_code branch_code account_number]
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
@@ -55,16 +57,23 @@ module Ibandit
|
|
55
57
|
return {} unless local_details[:account_number].length >= 4
|
56
58
|
{
|
57
59
|
bank_code: local_details[:bank_code],
|
58
|
-
account_number: local_details[:account_number].rjust(11,
|
60
|
+
account_number: local_details[:account_number].rjust(11, "0"),
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.clean_au_details(local_details)
|
65
|
+
{
|
66
|
+
branch_code: local_details[:branch_code].delete("-"),
|
67
|
+
account_number: local_details[:account_number],
|
59
68
|
}
|
60
69
|
end
|
61
70
|
|
62
71
|
def self.clean_be_details(local_details)
|
63
|
-
account_number = local_details[:account_number].tr(
|
72
|
+
account_number = local_details[:account_number].tr("-", "")
|
64
73
|
|
65
74
|
{
|
66
75
|
bank_code: local_details[:bank_code] || account_number.slice(0, 3),
|
67
|
-
account_number: account_number
|
76
|
+
account_number: account_number,
|
68
77
|
}
|
69
78
|
end
|
70
79
|
|
@@ -76,7 +85,7 @@ module Ibandit
|
|
76
85
|
def self.clean_cy_details(local_details)
|
77
86
|
# Account number may be 7-16 digits long.
|
78
87
|
# Add leading zeros to account number if < 16 digits.
|
79
|
-
cleaned_bank_code = local_details[:bank_code].gsub(/[-\s]/,
|
88
|
+
cleaned_bank_code = local_details[:bank_code].gsub(/[-\s]/, "")
|
80
89
|
|
81
90
|
bank_code = cleaned_bank_code.slice(0, 3)
|
82
91
|
branch_code =
|
@@ -87,7 +96,7 @@ module Ibandit
|
|
87
96
|
end
|
88
97
|
account_number =
|
89
98
|
if local_details[:account_number].length >= 7
|
90
|
-
local_details[:account_number].rjust(16,
|
99
|
+
local_details[:account_number].rjust(16, "0")
|
91
100
|
else
|
92
101
|
local_details[:account_number]
|
93
102
|
end
|
@@ -95,7 +104,7 @@ module Ibandit
|
|
95
104
|
{
|
96
105
|
bank_code: bank_code,
|
97
106
|
branch_code: branch_code,
|
98
|
-
account_number: account_number
|
107
|
+
account_number: account_number,
|
99
108
|
}
|
100
109
|
end
|
101
110
|
|
@@ -106,16 +115,16 @@ module Ibandit
|
|
106
115
|
account_number =
|
107
116
|
if local_details.include?(:account_number_prefix)
|
108
117
|
[
|
109
|
-
local_details[:account_number_prefix].rjust(6,
|
110
|
-
local_details[:account_number].rjust(10,
|
118
|
+
local_details[:account_number_prefix].rjust(6, "0"),
|
119
|
+
local_details[:account_number].rjust(10, "0"),
|
111
120
|
].join
|
112
121
|
else
|
113
|
-
local_details[:account_number].tr(
|
122
|
+
local_details[:account_number].tr("-", "").rjust(16, "0")
|
114
123
|
end
|
115
124
|
|
116
125
|
{
|
117
126
|
bank_code: local_details[:bank_code],
|
118
|
-
account_number: account_number
|
127
|
+
account_number: account_number,
|
119
128
|
}
|
120
129
|
end
|
121
130
|
|
@@ -137,7 +146,7 @@ module Ibandit
|
|
137
146
|
|
138
147
|
{
|
139
148
|
bank_code: converted_details[:bank_code],
|
140
|
-
account_number: converted_details[:account_number].rjust(10,
|
149
|
+
account_number: converted_details[:account_number].rjust(10, "0"),
|
141
150
|
}
|
142
151
|
end
|
143
152
|
|
@@ -145,12 +154,12 @@ module Ibandit
|
|
145
154
|
# This method supports being passed the component IBAN parts, as defined
|
146
155
|
# by SWIFT, or a single traditional-format string split by a '-'.
|
147
156
|
if local_details[:bank_code]
|
148
|
-
bank_code = local_details[:bank_code].rjust(4,
|
149
|
-
account_number = local_details[:account_number].rjust(10,
|
150
|
-
elsif local_details[:account_number].include?(
|
151
|
-
bank_code, account_number = local_details[:account_number].split(
|
152
|
-
elsif local_details[:account_number].gsub(/\s/,
|
153
|
-
cleaned_account_number = local_details[:account_number].gsub(/\s/,
|
157
|
+
bank_code = local_details[:bank_code].rjust(4, "0")
|
158
|
+
account_number = local_details[:account_number].rjust(10, "0")
|
159
|
+
elsif local_details[:account_number].include?("-")
|
160
|
+
bank_code, account_number = local_details[:account_number].split("-", 2)
|
161
|
+
elsif local_details[:account_number].gsub(/\s/, "").length == 14
|
162
|
+
cleaned_account_number = local_details[:account_number].gsub(/\s/, "")
|
154
163
|
bank_code = cleaned_account_number.slice(0, 4)
|
155
164
|
account_number = cleaned_account_number.slice(4, 10)
|
156
165
|
else
|
@@ -158,8 +167,8 @@ module Ibandit
|
|
158
167
|
end
|
159
168
|
|
160
169
|
{
|
161
|
-
bank_code: bank_code.rjust(4,
|
162
|
-
account_number: account_number.delete(
|
170
|
+
bank_code: bank_code.rjust(4, "0"),
|
171
|
+
account_number: account_number.delete("-").rjust(10, "0"),
|
163
172
|
}
|
164
173
|
end
|
165
174
|
|
@@ -171,16 +180,16 @@ module Ibandit
|
|
171
180
|
# account number and converted using the rules at
|
172
181
|
# http://www.pangaliit.ee/en/settlements-and-standards/bank-codes-of-estonian-banks
|
173
182
|
domestic_bank_code =
|
174
|
-
local_details[:account_number].gsub(/\A0+/,
|
183
|
+
local_details[:account_number].gsub(/\A0+/, "").slice(0, 2)
|
175
184
|
|
176
185
|
iban_bank_code =
|
177
186
|
case domestic_bank_code
|
178
|
-
when
|
179
|
-
when
|
187
|
+
when "11" then "22"
|
188
|
+
when "93" then "00"
|
180
189
|
else domestic_bank_code
|
181
190
|
end
|
182
191
|
|
183
|
-
account_number = local_details[:account_number].rjust(14,
|
192
|
+
account_number = local_details[:account_number].rjust(14, "0")
|
184
193
|
|
185
194
|
{ bank_code: iban_bank_code, account_number: account_number }
|
186
195
|
end
|
@@ -191,10 +200,10 @@ module Ibandit
|
|
191
200
|
if local_details[:bank_code] && local_details[:branch_code]
|
192
201
|
bank_code = local_details[:bank_code]
|
193
202
|
branch_code = local_details[:branch_code]
|
194
|
-
account_number = local_details[:account_number].gsub(/[-\s]/,
|
203
|
+
account_number = local_details[:account_number].gsub(/[-\s]/, "")
|
195
204
|
else
|
196
205
|
cleaned_account_number =
|
197
|
-
local_details[:account_number].gsub(/[-\s]/,
|
206
|
+
local_details[:account_number].gsub(/[-\s]/, "")
|
198
207
|
|
199
208
|
bank_code = cleaned_account_number.slice(0, 4)
|
200
209
|
branch_code = cleaned_account_number.slice(4, 4)
|
@@ -204,7 +213,7 @@ module Ibandit
|
|
204
213
|
{
|
205
214
|
bank_code: bank_code,
|
206
215
|
branch_code: branch_code,
|
207
|
-
account_number: account_number
|
216
|
+
account_number: account_number,
|
208
217
|
}
|
209
218
|
end
|
210
219
|
|
@@ -213,18 +222,18 @@ module Ibandit
|
|
213
222
|
# by adding zero-padding. The expansion method depends on the first
|
214
223
|
# character of the bank code.
|
215
224
|
account_number =
|
216
|
-
if %w
|
225
|
+
if %w[4 5 6].include?(local_details[:bank_code][0])
|
217
226
|
[
|
218
227
|
local_details[:account_number][0],
|
219
|
-
local_details[:account_number][1..-1].rjust(7,
|
228
|
+
local_details[:account_number][1..-1].rjust(7, "0"),
|
220
229
|
].join
|
221
230
|
else
|
222
|
-
local_details[:account_number].rjust(8,
|
231
|
+
local_details[:account_number].rjust(8, "0")
|
223
232
|
end
|
224
233
|
|
225
234
|
{
|
226
235
|
bank_code: local_details[:bank_code],
|
227
|
-
account_number: account_number
|
236
|
+
account_number: account_number,
|
228
237
|
}
|
229
238
|
end
|
230
239
|
|
@@ -232,29 +241,29 @@ module Ibandit
|
|
232
241
|
{
|
233
242
|
bank_code: local_details[:bank_code],
|
234
243
|
branch_code: local_details[:branch_code],
|
235
|
-
account_number: local_details[:account_number].gsub(/[-\s]/,
|
244
|
+
account_number: local_details[:account_number].gsub(/[-\s]/, ""),
|
236
245
|
}
|
237
246
|
end
|
238
247
|
|
239
248
|
def self.clean_gb_details(local_details)
|
240
249
|
# Account number may be 6-8 digits
|
241
250
|
# Add leading zeros to account number if < 8 digits.
|
242
|
-
branch_code = local_details[:branch_code].gsub(/[-\s]/,
|
251
|
+
branch_code = local_details[:branch_code].gsub(/[-\s]/, "")
|
243
252
|
|
244
253
|
if local_details[:bank_code]
|
245
254
|
bank_code = local_details[:bank_code]
|
246
255
|
else
|
247
|
-
bic = Ibandit.find_bic(
|
256
|
+
bic = Ibandit.find_bic("GB", branch_code)
|
248
257
|
bank_code = bic.nil? ? nil : bic.slice(0, 4)
|
249
258
|
end
|
250
259
|
|
251
|
-
account_number = local_details[:account_number].gsub(/[-\s]/,
|
252
|
-
account_number = account_number.rjust(8,
|
260
|
+
account_number = local_details[:account_number].gsub(/[-\s]/, "")
|
261
|
+
account_number = account_number.rjust(8, "0") if account_number.length > 5
|
253
262
|
|
254
263
|
{
|
255
264
|
bank_code: bank_code,
|
256
265
|
branch_code: branch_code,
|
257
|
-
account_number: account_number
|
266
|
+
account_number: account_number,
|
258
267
|
}
|
259
268
|
end
|
260
269
|
|
@@ -268,13 +277,13 @@ module Ibandit
|
|
268
277
|
# This method supports being passed the component IBAN parts, as defined
|
269
278
|
# by SWIFT, or a single traditional-format string split by a '-'.
|
270
279
|
return local_details if local_details[:bank_code]
|
271
|
-
return local_details unless local_details[:account_number].include?(
|
280
|
+
return local_details unless local_details[:account_number].include?("-")
|
272
281
|
|
273
|
-
bank_code, account_number = local_details[:account_number].split(
|
282
|
+
bank_code, account_number = local_details[:account_number].split("-", 2)
|
274
283
|
|
275
284
|
{
|
276
285
|
bank_code: bank_code,
|
277
|
-
account_number: account_number
|
286
|
+
account_number: account_number,
|
278
287
|
}
|
279
288
|
end
|
280
289
|
|
@@ -285,20 +294,20 @@ module Ibandit
|
|
285
294
|
return local_details
|
286
295
|
end
|
287
296
|
|
288
|
-
cleaned_acct_number = local_details[:account_number].gsub(/[-\s]/,
|
297
|
+
cleaned_acct_number = local_details[:account_number].gsub(/[-\s]/, "")
|
289
298
|
|
290
299
|
case cleaned_acct_number.length
|
291
300
|
when 16
|
292
301
|
{
|
293
302
|
bank_code: cleaned_acct_number.slice(0, 3),
|
294
303
|
branch_code: cleaned_acct_number.slice(3, 4),
|
295
|
-
account_number: cleaned_acct_number.slice(7, 9).ljust(17,
|
304
|
+
account_number: cleaned_acct_number.slice(7, 9).ljust(17, "0"),
|
296
305
|
}
|
297
306
|
when 24
|
298
307
|
{
|
299
308
|
bank_code: cleaned_acct_number.slice(0, 3),
|
300
309
|
branch_code: cleaned_acct_number.slice(3, 4),
|
301
|
-
account_number: cleaned_acct_number.slice(7, 17)
|
310
|
+
account_number: cleaned_acct_number.slice(7, 17),
|
302
311
|
}
|
303
312
|
else local_details
|
304
313
|
end
|
@@ -306,39 +315,39 @@ module Ibandit
|
|
306
315
|
|
307
316
|
def self.clean_ie_details(local_details)
|
308
317
|
# Ireland uses the same local details as the United Kingdom
|
309
|
-
branch_code = local_details[:branch_code].gsub(/[-\s]/,
|
318
|
+
branch_code = local_details[:branch_code].gsub(/[-\s]/, "")
|
310
319
|
|
311
320
|
if local_details[:bank_code]
|
312
321
|
bank_code = local_details[:bank_code]
|
313
322
|
else
|
314
|
-
bic = Ibandit.find_bic(
|
323
|
+
bic = Ibandit.find_bic("IE", branch_code)
|
315
324
|
bank_code = bic.nil? ? nil : bic.slice(0, 4)
|
316
325
|
end
|
317
326
|
|
318
|
-
account_number = local_details[:account_number].gsub(/[-\s]/,
|
319
|
-
account_number = account_number.rjust(8,
|
327
|
+
account_number = local_details[:account_number].gsub(/[-\s]/, "")
|
328
|
+
account_number = account_number.rjust(8, "0") if account_number.length > 5
|
320
329
|
|
321
330
|
{
|
322
331
|
bank_code: bank_code,
|
323
332
|
branch_code: branch_code,
|
324
|
-
account_number: account_number
|
333
|
+
account_number: account_number,
|
325
334
|
}
|
326
335
|
end
|
327
336
|
|
328
337
|
def self.clean_is_details(local_details)
|
329
338
|
if local_details[:bank_code]
|
330
339
|
bank_code = local_details[:bank_code]
|
331
|
-
parts = local_details[:account_number].split(
|
332
|
-
elsif local_details[:account_number].include?(
|
333
|
-
bank_code, *parts = local_details[:account_number].split(
|
340
|
+
parts = local_details[:account_number].split("-")
|
341
|
+
elsif local_details[:account_number].include?("-")
|
342
|
+
bank_code, *parts = local_details[:account_number].split("-")
|
334
343
|
else
|
335
344
|
bank_code = local_details[:account_number].slice(0, 4)
|
336
345
|
parts = Array(local_details[:account_number][4..-1])
|
337
346
|
end
|
338
347
|
|
339
348
|
{
|
340
|
-
bank_code: bank_code.rjust(4,
|
341
|
-
account_number: pad_is_account_number(parts)
|
349
|
+
bank_code: bank_code.rjust(4, "0"),
|
350
|
+
account_number: pad_is_account_number(parts),
|
342
351
|
}
|
343
352
|
end
|
344
353
|
|
@@ -347,7 +356,7 @@ module Ibandit
|
|
347
356
|
{
|
348
357
|
bank_code: local_details[:bank_code],
|
349
358
|
branch_code: local_details[:branch_code],
|
350
|
-
account_number: local_details[:account_number].rjust(12,
|
359
|
+
account_number: local_details[:account_number].rjust(12, "0"),
|
351
360
|
}
|
352
361
|
end
|
353
362
|
|
@@ -378,17 +387,17 @@ module Ibandit
|
|
378
387
|
if local_details[:bank_code]
|
379
388
|
bank_code = local_details[:bank_code]
|
380
389
|
else
|
381
|
-
bic = Ibandit.find_bic(
|
390
|
+
bic = Ibandit.find_bic("MT", branch_code)
|
382
391
|
bank_code = bic.nil? ? nil : bic.slice(0, 4)
|
383
392
|
end
|
384
393
|
|
385
|
-
account_number = local_details[:account_number].gsub(/[-\s]/,
|
386
|
-
account_number = account_number.rjust(18,
|
394
|
+
account_number = local_details[:account_number].gsub(/[-\s]/, "")
|
395
|
+
account_number = account_number.rjust(18, "0")
|
387
396
|
|
388
397
|
{
|
389
398
|
bank_code: bank_code,
|
390
399
|
branch_code: branch_code,
|
391
|
-
account_number: account_number
|
400
|
+
account_number: account_number,
|
392
401
|
}
|
393
402
|
end
|
394
403
|
|
@@ -396,7 +405,7 @@ module Ibandit
|
|
396
405
|
# Add leading zeros to account number if < 10 digits.
|
397
406
|
{
|
398
407
|
bank_code: local_details[:bank_code],
|
399
|
-
account_number: local_details[:account_number].rjust(10,
|
408
|
+
account_number: local_details[:account_number].rjust(10, "0"),
|
400
409
|
}
|
401
410
|
end
|
402
411
|
|
@@ -407,7 +416,7 @@ module Ibandit
|
|
407
416
|
bank_code = local_details[:bank_code]
|
408
417
|
account_number = local_details[:account_number]
|
409
418
|
else
|
410
|
-
cleaned_acct_number = local_details[:account_number].gsub(/[-.\s]/,
|
419
|
+
cleaned_acct_number = local_details[:account_number].gsub(/[-.\s]/, "")
|
411
420
|
|
412
421
|
bank_code = cleaned_acct_number.slice(0, 4)
|
413
422
|
account_number = cleaned_acct_number[4..-1]
|
@@ -415,7 +424,7 @@ module Ibandit
|
|
415
424
|
|
416
425
|
{
|
417
426
|
bank_code: bank_code,
|
418
|
-
account_number: account_number
|
427
|
+
account_number: account_number,
|
419
428
|
}
|
420
429
|
end
|
421
430
|
|
@@ -426,7 +435,7 @@ module Ibandit
|
|
426
435
|
bank_code = local_details[:bank_code]
|
427
436
|
account_number = local_details[:account_number]
|
428
437
|
else
|
429
|
-
cleaned_acct_number = local_details[:account_number].gsub(/[\s]/,
|
438
|
+
cleaned_acct_number = local_details[:account_number].gsub(/[\s]/, "")
|
430
439
|
|
431
440
|
bank_code = cleaned_acct_number.slice(2, 8)
|
432
441
|
account_number = cleaned_acct_number[10..-1]
|
@@ -434,7 +443,7 @@ module Ibandit
|
|
434
443
|
|
435
444
|
{
|
436
445
|
bank_code: bank_code,
|
437
|
-
account_number: account_number
|
446
|
+
account_number: account_number,
|
438
447
|
}
|
439
448
|
end
|
440
449
|
|
@@ -451,14 +460,14 @@ module Ibandit
|
|
451
460
|
if local_details[:bank_code]
|
452
461
|
# If a bank_code was provided without a branch code we're (probably)
|
453
462
|
# dealing with SWIFT details and should just return them.
|
454
|
-
|
463
|
+
{
|
455
464
|
swift_account_number: local_details[:account_number],
|
456
|
-
swift_bank_code: local_details[:bank_code]
|
465
|
+
swift_bank_code: local_details[:bank_code],
|
457
466
|
}
|
458
467
|
else
|
459
468
|
Sweden::LocalDetailsConverter.new(
|
460
469
|
branch_code: local_details[:branch_code],
|
461
|
-
account_number: local_details[:account_number]
|
470
|
+
account_number: local_details[:account_number],
|
462
471
|
).convert
|
463
472
|
end
|
464
473
|
end
|
@@ -467,7 +476,7 @@ module Ibandit
|
|
467
476
|
# Add leading zeros to account number if < 10 digits.
|
468
477
|
{
|
469
478
|
bank_code: local_details[:bank_code],
|
470
|
-
account_number: local_details[:account_number].rjust(10,
|
479
|
+
account_number: local_details[:account_number].rjust(10, "0"),
|
471
480
|
}
|
472
481
|
end
|
473
482
|
|
@@ -482,12 +491,12 @@ module Ibandit
|
|
482
491
|
end
|
483
492
|
|
484
493
|
def self.pad_is_account_number(parts)
|
485
|
-
hufo = parts[0].nil? ?
|
486
|
-
reikningsnumer = parts[1].nil? ?
|
487
|
-
ken_1 = parts[2].nil? ?
|
488
|
-
ken_2 = parts[3].nil? ?
|
494
|
+
hufo = parts[0].nil? ? "" : parts[0].rjust(2, "0")
|
495
|
+
reikningsnumer = parts[1].nil? ? "" : parts[1].rjust(6, "0")
|
496
|
+
ken_1 = parts[2].nil? ? "" : parts[2].rjust(6, "0")
|
497
|
+
ken_2 = parts[3].nil? ? "" : parts[3].rjust(4, "0")
|
489
498
|
|
490
|
-
kennitala = ken_1.empty? ?
|
499
|
+
kennitala = ken_1.empty? ? "" : (ken_1 + ken_2).rjust(10, "0")
|
491
500
|
|
492
501
|
hufo + reikningsnumer + kennitala
|
493
502
|
end
|
@@ -497,7 +506,7 @@ module Ibandit
|
|
497
506
|
{
|
498
507
|
swift_bank_code: local_details[:bank_code],
|
499
508
|
swift_branch_code: local_details[:branch_code],
|
500
|
-
swift_account_number: local_details[:account_number]
|
509
|
+
swift_account_number: local_details[:account_number],
|
501
510
|
}
|
502
511
|
end
|
503
512
|
private_class_method :swift_details_for
|