ibandit 0.6.5 → 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 823a2e3a40462ece9f02dca4e2442017d1372b57
4
- data.tar.gz: 153d927db1dc73912738f0f49396a97fb8e17024
3
+ metadata.gz: f800e698be58f3378b478f197526c5d2bdec8770
4
+ data.tar.gz: f8650d0eca790ea52617ea1b46da45c5c7f47f3a
5
5
  SHA512:
6
- metadata.gz: 14cc8a274cd0b5d41249a4d3d043a582aba730b096438d206de9aa008f88672f8f451e0ba196b1780443b13cb592af93b3706c3125ee05e6531989ff80c20239
7
- data.tar.gz: 7c060ed0b1a379d0617210c8ab0e485a5c1f4ee32e66c706a27fbdd774c9c9926a8311f5ebac4aa3fb7d1d9005ce3ba9399a9b3baa4dd8c9a0a8734405a04e5a
6
+ metadata.gz: 07b6d6a4a99a90ebb8810b11aed7c8de97d8ce27c5c25a12902761650c49a88a2cd947f9e1fda776917a90d57cb20f55d9f871cd2d3977baf971bb831a9e9955
7
+ data.tar.gz: 0b895a47575ec3722376372b938218363d7bd996345932d4e6627242e5ca50b47680f7fd3cd425fca02769a59e42f7f08344660e8025d1b4068177e317576f35
data/CHANGELOG.md CHANGED
@@ -1,4 +1,6 @@
1
- ## Unreleased
1
+ ## 0.6.6 - July 31, 2015
2
+ - Add Croatia to LocalDetailsCleaner and IBANAssembler
3
+ - Add Czech Republic to LocalDetailsCleaner and IBANAssembler
2
4
 
3
5
  ## 0.6.5 - July 30, 2015
4
6
  - Add Romania to LocalDetailsCleaner and IBANAssembler
data/README.md CHANGED
@@ -183,6 +183,13 @@ iban = Ibandit::IBAN.new(
183
183
  )
184
184
  iban.iban # => "BG80BNBG96611020345678"
185
185
 
186
+ # Croatia
187
+ iban = Ibandit::IBAN.new(
188
+ country_code: 'HR',
189
+ account_number: '1001005-1863000160',
190
+ )
191
+ iban.iban # => "HR1210010051863000160"
192
+
186
193
  # Cyprus
187
194
  iban = Ibandit::IBAN.new(
188
195
  country_code: 'CY',
@@ -192,13 +199,14 @@ iban = Ibandit::IBAN.new(
192
199
  )
193
200
  iban.iban # => "CY17002001280000001200527600"
194
201
 
195
- # Germany
202
+ # Czech Republic
196
203
  iban = Ibandit::IBAN.new(
197
- country_code: 'DE',
198
- bank_code: '37040044',
199
- account_number: '0532013000'
204
+ country_code: 'CZ',
205
+ bank_code: '0800',
206
+ account_number_prefix: '19',
207
+ account_number: '2000145399'
200
208
  )
201
- iban.iban # => "DE89370400440532013000"
209
+ iban.iban # => "CZ6508000000192000145399"
202
210
 
203
211
  # Denmark
204
212
  iban = Ibandit::IBAN.new(
@@ -231,14 +239,13 @@ iban = Ibandit::IBAN.new(
231
239
  )
232
240
  iban.iban # => "FR1420041010050500013M02606"
233
241
 
234
- # United Kingdom
242
+ # Germany
235
243
  iban = Ibandit::IBAN.new(
236
- country_code: 'GB',
237
- bank_code: 'BARC', # optional if a BIC finder is configured
238
- branch_code: '200000',
239
- account_number: '55779911'
244
+ country_code: 'DE',
245
+ bank_code: '37040044',
246
+ account_number: '0532013000'
240
247
  )
241
- iban.iban # => "GB60BARC20000055779911"
248
+ iban.iban # => "DE89370400440532013000"
242
249
 
243
250
  # Greece
244
251
  iban = Ibandit::IBAN.new(
@@ -390,15 +397,6 @@ iban = Ibandit::IBAN.new(
390
397
  iban.iban # => "SI56191000000123438"
391
398
 
392
399
  # Spain
393
- iban = Ibandit::IBAN.new(
394
- country_code: 'ES',
395
- bank_code: '2310',
396
- branch_code: '0001',
397
- account_number: '180000012345'
398
- )
399
- iban.iban # => "ES8023100001180000012345"
400
-
401
- # Spain with 20 digit account number
402
400
  iban = Ibandit::IBAN.new(
403
401
  country_code: 'ES',
404
402
  account_number: '23100001180000012345'
@@ -411,6 +409,15 @@ iban = Ibandit::IBAN.new(
411
409
  account_number: '7507-1211203'
412
410
  )
413
411
  iban.iban # => "SE2680000000075071211203"
412
+
413
+ # United Kingdom
414
+ iban = Ibandit::IBAN.new(
415
+ country_code: 'GB',
416
+ bank_code: 'BARC', # optional if a BIC finder is configured
417
+ branch_code: '200000',
418
+ account_number: '55779911'
419
+ )
420
+ iban.iban # => "GB60BARC20000055779911"
414
421
  ```
415
422
 
416
423
  ## Other libraries
@@ -102,6 +102,23 @@ module Ibandit
102
102
  result < 10 ? result.to_s : '0'
103
103
  end
104
104
 
105
+ # Currently unused in this gem. This method calculates the last digit
106
+ # of a Croatian account number when given the initial digits.
107
+ def self.croatian(string)
108
+ calculation = string.chars.map.reduce(10) do |total, char|
109
+ unless char.to_i.to_s == char
110
+ raise InvalidCharacterError,
111
+ "Unexpected non-numeric character '#{char}'"
112
+ end
113
+
114
+ calc = (char.to_i + total) % 10
115
+ calc = calc == 0 ? 10 : calc
116
+ (calc * 2) % 11
117
+ end
118
+
119
+ ((11 - calculation) % 10).to_s
120
+ end
121
+
105
122
  # Currently unused in this gem. This method calculates the penultimate digit
106
123
  # of an Icelandic kennitala (included in the account number) when given the
107
124
  # first 8 digits.
@@ -1,7 +1,7 @@
1
1
  module Ibandit
2
2
  module IBANAssembler
3
- SUPPORTED_COUNTRY_CODES = %w(AT BE BG CY DE DK EE ES FI FR GB GR HU IE IS IT
4
- LT LU LV MC MT NL NO PL PT RO SE SI SK
3
+ SUPPORTED_COUNTRY_CODES = %w(AT BE BG CY CZ DE DK EE ES FI FR GB GR HR HU IE
4
+ IS IT LT LU LV MC MT NL NO PL PT RO SE SI SK
5
5
  SM).freeze
6
6
 
7
7
  EXCEPTION_COUNTRY_CODES = %w(IT SM BE).freeze
@@ -85,7 +85,7 @@ module Ibandit
85
85
 
86
86
  def self.required_fields(country_code)
87
87
  case country_code
88
- when *%w(AT CY DE DK EE FI IS LT LU LV NL NO PL RO SE SI SK)
88
+ when *%w(AT CY CZ DE DK EE FI HR IS LT LU LV NL NO PL RO SE SI SK)
89
89
  %i(bank_code account_number)
90
90
  when 'BE'
91
91
  %i(account_number)
@@ -100,7 +100,7 @@ module Ibandit
100
100
  when 'BE' then %i(bank_code account_number)
101
101
  when 'CY' then %i(bank_code branch_code account_number)
102
102
  when 'IT' then %i(bank_code branch_code account_number check_digit)
103
- when 'SK' then %i(bank_code account_number account_number_prefix)
103
+ when 'CZ', 'SK' then %i(bank_code account_number account_number_prefix)
104
104
  else required_fields(country_code)
105
105
  end
106
106
  end
@@ -1,7 +1,7 @@
1
1
  module Ibandit
2
2
  module LocalDetailsCleaner
3
- SUPPORTED_COUNTRY_CODES = %w(AT BE BG CY DE DK EE ES FI FR GB GR HU IE IS IT
4
- LT LU LV MC MT NL NO PL PT RO SE SI SK
3
+ SUPPORTED_COUNTRY_CODES = %w(AT BE BG CY CZ DE DK EE ES FI FR GB GR HR HU IE
4
+ IS IT LT LU LV MC MT NL NO PL PT RO SE SI SK
5
5
  SM).freeze
6
6
 
7
7
  def self.clean(local_details)
@@ -30,7 +30,7 @@ module Ibandit
30
30
  case country_code
31
31
  when 'AT', 'CY', 'DE', 'FI', 'LT', 'LU', 'LV', 'NL', 'RO', 'SI', 'SK'
32
32
  %i(bank_code account_number)
33
- when 'BE', 'DK', 'EE', 'ES', 'HU', 'IS', 'NO', 'PL', 'SE'
33
+ when 'BE', 'CZ', 'DK', 'EE', 'ES', 'HR', 'HU', 'IS', 'NO', 'PL', 'SE'
34
34
  %i(account_number)
35
35
  when 'GB', 'IE', 'MT'
36
36
  if Ibandit.bic_finder.nil? then %i(bank_code branch_code account_number)
@@ -95,6 +95,26 @@ module Ibandit
95
95
  }
96
96
  end
97
97
 
98
+ def self.clean_cz_details(local_details)
99
+ # The SWIFT definition of a Czech IBAN includes both the account
100
+ # number prefix and the account number. This method therefore supports
101
+ # passing those fields concatenated.
102
+ account_number =
103
+ if local_details.include?(:account_number_prefix)
104
+ [
105
+ local_details[:account_number_prefix].rjust(6, '0'),
106
+ local_details[:account_number].rjust(10, '0')
107
+ ].join
108
+ else
109
+ local_details[:account_number].tr('-', '').rjust(16, '0')
110
+ end
111
+
112
+ {
113
+ bank_code: local_details[:bank_code],
114
+ account_number: account_number
115
+ }
116
+ end
117
+
98
118
  def self.clean_de_details(local_details)
99
119
  # Account number may be up to 10 digits long.
100
120
  # Add leading zeros to account number if < 10 digits.
@@ -233,6 +253,20 @@ module Ibandit
233
253
  local_details
234
254
  end
235
255
 
256
+ def self.clean_hr_details(local_details)
257
+ # This method supports being passed the component IBAN parts, as defined
258
+ # by SWIFT, or a single traditional-format string split by a '-'.
259
+ return local_details if local_details[:bank_code]
260
+ return local_details unless local_details[:account_number].include?('-')
261
+
262
+ bank_code, account_number = local_details[:account_number].split('-', 2)
263
+
264
+ {
265
+ bank_code: bank_code,
266
+ account_number: account_number
267
+ }
268
+ end
269
+
236
270
  def self.clean_hu_details(local_details)
237
271
  # This method supports being passed the component IBAN parts, as defined
238
272
  # by SWIFT, or a single 16 or 24 digit string.
@@ -423,23 +457,8 @@ module Ibandit
423
457
  end
424
458
 
425
459
  def self.clean_sk_details(local_details)
426
- # The SWIFT definition of a Slovakian IBAN includes both the account
427
- # number prefix and the account number. This method therefore supports
428
- # passing those fields concatenated.
429
- account_number =
430
- if local_details.include?(:account_number_prefix)
431
- [
432
- local_details[:account_number_prefix].rjust(6, '0'),
433
- local_details[:account_number].rjust(10, '0')
434
- ].join
435
- else
436
- local_details[:account_number].tr('-', '').rjust(16, '0')
437
- end
438
-
439
- {
440
- bank_code: local_details[:bank_code],
441
- account_number: account_number
442
- }
460
+ # Slovakia uses the same local details method as the Czech Republic
461
+ clean_cz_details(local_details)
443
462
  end
444
463
 
445
464
  def self.clean_sm_details(local_details)
@@ -1,3 +1,3 @@
1
1
  module Ibandit
2
- VERSION = '0.6.5'.freeze
2
+ VERSION = '0.6.6'.freeze
3
3
  end
@@ -126,6 +126,28 @@ describe Ibandit::CheckDigit do
126
126
  end
127
127
  end
128
128
 
129
+ describe '.croatian' do
130
+ subject { described_class.croatian(account_number) }
131
+
132
+ let(:account_number) { '0823' }
133
+ it { is_expected.to eq('5') }
134
+
135
+ context 'with another account number (double checking!)' do
136
+ let(:account_number) { '100100' }
137
+ it { is_expected.to eq('5') }
138
+ end
139
+
140
+ context 'with all zeros' do
141
+ let(:account_number) { '186300016' }
142
+ it { is_expected.to eq('0') }
143
+ end
144
+
145
+ context 'with a non-numeric character' do
146
+ let(:account_number) { '1BAD2014' }
147
+ specify { expect { subject }.to raise_error(/non-numeric character/) }
148
+ end
149
+ end
150
+
129
151
  describe '.icelandic' do
130
152
  subject { described_class.icelandic(kennitala) }
131
153
 
@@ -123,6 +123,30 @@ describe Ibandit::IBANAssembler do
123
123
  end
124
124
  end
125
125
 
126
+ context 'with CZ as the country_code' do
127
+ let(:args) do
128
+ {
129
+ country_code: 'CZ',
130
+ bank_code: '0800',
131
+ account_number: '0000192000145399'
132
+ }
133
+ end
134
+
135
+ it { is_expected.to eq('CZ6508000000192000145399') }
136
+
137
+ it_behaves_like 'allows round trips', 'CZ65 0800 0000 1920 0014 5399'
138
+
139
+ context 'without a bank_code' do
140
+ before { args.delete(:bank_code) }
141
+ it { is_expected.to be_nil }
142
+ end
143
+
144
+ context 'without an account_number' do
145
+ before { args.delete(:account_number) }
146
+ it { is_expected.to be_nil }
147
+ end
148
+ end
149
+
126
150
  context 'with DE as the country_code' do
127
151
  let(:args) do
128
152
  { country_code: 'DE',
@@ -339,6 +363,28 @@ describe Ibandit::IBANAssembler do
339
363
  end
340
364
  end
341
365
 
366
+ context 'with HR as the country_code' do
367
+ let(:args) do
368
+ { country_code: 'HR',
369
+ bank_code: '1001005',
370
+ account_number: '1863000160' }
371
+ end
372
+
373
+ it { is_expected.to eq('HR1210010051863000160') }
374
+
375
+ it_behaves_like 'allows round trips', 'HR12 1001 0051 8630 0016 0'
376
+
377
+ context 'without a bank_code' do
378
+ before { args.delete(:bank_code) }
379
+ it { is_expected.to be_nil }
380
+ end
381
+
382
+ context 'without an account_number' do
383
+ before { args.delete(:account_number) }
384
+ it { is_expected.to be_nil }
385
+ end
386
+ end
387
+
342
388
  context 'with HU as the country_code' do
343
389
  let(:args) do
344
390
  {
@@ -152,6 +152,37 @@ describe Ibandit::LocalDetailsCleaner do
152
152
  end
153
153
  end
154
154
 
155
+ context 'Czech Republic' do
156
+ let(:country_code) { 'CZ' }
157
+ let(:bank_code) { '0800' }
158
+ let(:account_number) { '0000192000145399' }
159
+
160
+ it { is_expected.to eq(local_details) }
161
+
162
+ context 'with an account number prefix' do
163
+ let(:prefix) { '000019' }
164
+ let(:account_number) { '2000145399' }
165
+ before { local_details.merge!(account_number_prefix: prefix) }
166
+
167
+ its([:account_number]) { is_expected.to eq('0000192000145399') }
168
+
169
+ context 'which needs zero-padding' do
170
+ let(:prefix) { '19' }
171
+ its([:account_number]) { is_expected.to eq('0000192000145399') }
172
+ end
173
+ end
174
+
175
+ context 'without a bank code' do
176
+ let(:bank_code) { nil }
177
+ it { is_expected.to eq(local_details) }
178
+ end
179
+
180
+ context 'without an account number' do
181
+ let(:account_number) { nil }
182
+ it { is_expected.to eq(local_details) }
183
+ end
184
+ end
185
+
155
186
  context 'Germany' do
156
187
  let(:country_code) { 'DE' }
157
188
  let(:bank_code) { '37040044' }
@@ -422,6 +453,33 @@ describe Ibandit::LocalDetailsCleaner do
422
453
  end
423
454
  end
424
455
 
456
+ context 'Croatia' do
457
+ let(:country_code) { 'HR' }
458
+ let(:bank_code) { '1001005' }
459
+ let(:account_number) { '1863000160' }
460
+
461
+ it { is_expected.to eq(local_details) }
462
+
463
+ context 'with bank code in the account number' do
464
+ let(:bank_code) { nil }
465
+ let(:branch_code) { nil }
466
+ let(:account_number) { '1001005-1863000160' }
467
+
468
+ its([:bank_code]) { is_expected.to eq('1001005') }
469
+ its([:account_number]) { is_expected.to eq('1863000160') }
470
+
471
+ context 'with a badly formatted account number' do
472
+ let(:account_number) { '1863000160' }
473
+ it { is_expected.to eq(local_details) }
474
+ end
475
+ end
476
+
477
+ context 'without an account number' do
478
+ let(:account_number) { nil }
479
+ it { is_expected.to eq(local_details) }
480
+ end
481
+ end
482
+
425
483
  context 'Hungary' do
426
484
  let(:country_code) { 'HU' }
427
485
  let(:bank_code) { '117' }
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: 0.6.5
4
+ version: 0.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grey Baker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-30 00:00:00.000000000 Z
11
+ date: 2015-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec