bank-contact 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 35f525516d204bf07672f0e9eb8272fba286e433
4
+ data.tar.gz: c93cde9f372cb0d01562c612db3c23c56a81c26a
5
+ SHA512:
6
+ metadata.gz: cb32dba59a577154600af67926b5e93cd461c9b9158bf609b56679a4bcbdf128f3740d5a4d36480480d022b852fd23ee531639c56af7f89d08ea20513e0098b0
7
+ data.tar.gz: da4bad5cc7555c3d9fa4f73a2ab355c1220ba198f52ae10ea07b7dfea71dbf5fec03d14a06291597dd9468cf26b529be42774c24ee42e8abcecfdf8dc873b4b6
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - 2.0.0
5
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in bank.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Kevin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,94 @@
1
+ # Bank
2
+
3
+ IBAN & BIC information, validation and formatting. Ships with ActiveModel validators.
4
+
5
+ [![GitHub version](https://badge.fury.io/gh/max-power%2Fbank.png)](http://badge.fury.io/gh/max-power%2Fbank)
6
+ [![Build Status](https://travis-ci.org/max-power/bank.png?branch=master)](https://travis-ci.org/max-power/bank)
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ gem 'bank-contact'
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install bank-contact
21
+
22
+ ## Usage
23
+
24
+ ### Bank:::IBAN
25
+
26
+ require 'bank/iban'
27
+
28
+ iban = IBAN.new("DE89 3704 0044 0532 0130 00")
29
+
30
+ iban.country_code # "DE"
31
+ iban.check_digits # "89"
32
+ iban.bban # "370400440532013000"
33
+ iban.account_number # "0532013000"
34
+ iban.bank_identifier # "37040044"
35
+
36
+ iban.valid? # true
37
+
38
+ iban.to_s # "DE89370400440532013000"
39
+ iban.to_s(true) # "DE89 3704 0044 0532 0130 00"
40
+
41
+ iban.to_i # 370400440532013000131489
42
+
43
+ # or
44
+
45
+ IBAN.valid? "DE89 3704 0044 0532 0130 00" # true
46
+
47
+ or as ActiveModel Validator (make sure you have 'active_model' in your Gemfile)
48
+
49
+ class Company
50
+ include ActiveModel::Model
51
+ attr_accessor :iban
52
+ validates :iban, iban: true
53
+ end
54
+
55
+ ### Bank::BIC
56
+
57
+ require 'bank/bic'
58
+
59
+ bic = Bank::BIC.new('BYLADEM1203')
60
+ bic.bank_code
61
+ bic.country_code
62
+ bic.location_code
63
+ bic.branch_code
64
+ bic.to_s
65
+ bic.valid?
66
+
67
+ or as ActiveModel Validator (make sure you have 'active_model' in your Gemfile)
68
+
69
+ class Company
70
+ include ActiveModel::Model
71
+ attr_accessor :bic
72
+ validates :bic, bic: true
73
+ end
74
+
75
+ ### Bank::Contact
76
+
77
+ require 'bank/contact' # this requires 'iban' and 'bic'
78
+
79
+ # paramters: IBAN, BIC
80
+ contact = Bank::Contact.new("DE89 3704 0044 0532 0130 00", "BYLADEM1203")
81
+ contact.iban
82
+ contact.bic
83
+ contact.to_h
84
+ contact.to_a
85
+ contact.valid?
86
+
87
+
88
+ ## Contributing
89
+
90
+ 1. Fork it ( http://github.com/max-power/bank/fork )
91
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
92
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
93
+ 4. Push to the branch (`git push origin my-new-feature`)
94
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = 'spec/**/*_spec.rb'
6
+ t.libs << 'spec'
7
+ end
8
+
9
+ desc "Run tests"
10
+ task :default => :test
11
+
12
+ desc "Run console"
13
+ task :console do
14
+ require 'irb'
15
+ require 'irb/completion'
16
+ require 'bank/contact'
17
+ ARGV.clear
18
+ IRB.start
19
+ end
data/bank.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'bank/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "bank-contact"
8
+ spec.version = Bank::VERSION
9
+ spec.authors = ["Kevin"]
10
+ spec.email = ["kevin.melchert@gmail.com"]
11
+ spec.summary = %q{IBAN + SWIFT/BIC}
12
+ spec.description = %q{IBAN + SWIFT/BIC: Information, Validation and Formatting.}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "minitest", "~> 4.2"
24
+ spec.add_development_dependency 'activemodel', "~> 4.0.0"
25
+ end
data/data/iban.yml ADDED
@@ -0,0 +1,406 @@
1
+ # http://en.wikipedia.org/wiki/International_Bank_Account_Number#IBAN_formats_by_country
2
+ # http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf
3
+
4
+ al: # Albania
5
+ length: 28
6
+ # regexp: '\d{8}[A-Z0-9]{16}'
7
+ regexp: '(?<bank_identifier>\d{8})(?<account_number>[A-Z0-9]{16})'
8
+
9
+ ad: # Andorra
10
+ length: 24
11
+ # regexp: '\d{8}[A-Z0-9]{12}'
12
+ regexp: '(?<bank_identifier>\d{4})(?<branch_identifier>\d{4})(?<account_number>[A-Z0-9]{12})'
13
+
14
+ at: # Austria
15
+ length: 20
16
+ # regexp: '\d{16}'
17
+ regexp: '(?<bank_identifier>\d{5})(?<account_number>\d{11})'
18
+
19
+ az: # Azerbaijan
20
+ length: 28
21
+ # regexp: '[A-Z0-9]{4}\d{20}'
22
+ regexp: '(?<bank_identifier>[A-Z0-9]{4})(?<account_number>\d{20})'
23
+
24
+ bh: # Bahrain
25
+ length: 22
26
+ # regexp: '[A-Z]{4}[A-Z0-9]{14}'
27
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<account_number>[A-Z0-9]{14})'
28
+
29
+ be: # Belgium
30
+ length: 16
31
+ # regexp: '\d{12}'
32
+ regexp: '(?<bank_identifier>\d{3})(?<account_number>\d{7})(?<national_check_digits>\d{2})'
33
+
34
+ ba: # Bosnia and Herzegovina
35
+ length: 20
36
+ # regexp: '\d{16}'
37
+ regexp: '(?<bank_identifier>\d{3})(?<branch_identifier>\d{3})(?<account_number>\d{8})(?<national_check_digits>\d{2})'
38
+
39
+ br: # Brazil
40
+ length: 29
41
+ # regexp: '\d{23}[A-Z][A-Z0-9]'
42
+ regexp: '(?<bank_identifier>\d{8})(?<branch_identifier>\d{5})(?<account_number>\d{10})(?<account_type>[A-Z])(?<account_owner>[A-Z0-9])'
43
+
44
+ bg: # Bulgaria
45
+ length: 22
46
+ # regexp: '[A-Z]{4}\d{6}[A-Z0-9]{8}'
47
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<branch_identifier>\d{4})(?<account_type>\d{2})(?<account_number>[A-Z0-9]{8})'
48
+
49
+ cr: # Costa Rica
50
+ length: 21
51
+ # regexp: '\d{17}'
52
+ regexp: '(?<bank_identifier>\d{3})(?<account_number>\d{14})'
53
+
54
+ hr: # Croatia
55
+ length: 21
56
+ # regexp: '\d{17}'
57
+ regexp: '(?<bank_identifier>\d{7})(?<account_number>\d{10})'
58
+
59
+ cy: # Cyprus
60
+ length: 28
61
+ # regexp: '\d{8}[A-Z0-9]{16}'
62
+ regexp: '(?<bank_identifier>\d{3})(?<branch_identifier>\d{5})(?<account_number>[A-Z0-9]{16})'
63
+
64
+ cz: # Czech Republic
65
+ length: 24
66
+ # regexp: '\d{20}'
67
+ regexp: '(?<bank_identifier>\d{4})(?<account_number>\d{6}\d{10})'
68
+
69
+ de: # Germany
70
+ length: 22
71
+ # regexp: '\d{18}'
72
+ regexp: '(?<bank_identifier>\d{8})(?<account_number>\d{10})'
73
+
74
+ dk: # Denmark
75
+ length: 18
76
+ # regexp: '\d{14}'
77
+ regexp: '(?<bank_identifier>\d{4})(?<account_number>\d{9})(?<national_check_digits>\d{1})'
78
+
79
+ gl: # Greenland (same as Denmark)
80
+ length: 18
81
+ # regexp: '\d{14}'
82
+ regexp: '(?<bank_identifier>\d{4})(?<account_number>\d{9})(?<national_check_digits>\d{1})'
83
+
84
+ fo: # Faroe Islands (same as Denmark)
85
+ length: 18
86
+ # regexp: '\d{14}'
87
+ regexp: '(?<bank_identifier>\d{4})(?<account_number>\d{9})(?<national_check_digits>\d{1})'
88
+
89
+ do: # Dominican Republic
90
+ length: 28
91
+ # regexp: '[A-Z]{4}\d{20}'
92
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<account_number>\d{20})'
93
+
94
+ ee: # Estonia
95
+ length: 20
96
+ # regexp: '\d{16}'
97
+ regexp: '(?<bank_identifier>\d{2})(?<branch_identifier>\d{2})(?<account_number>\d{11})(?<national_check_digits>\d{1})'
98
+
99
+ fi: # Finland
100
+ length: 18
101
+ # regexp: '\d{14}'
102
+ regexp: '(?<bank_identifier>\d{6})(?<account_number>\d{7})(?<national_check_digits>\d{1})'
103
+
104
+ fr: # France
105
+ length: 27
106
+ # regexp: '\d{10}[A-Z0-9]{11}\d{2}'
107
+ regexp: '(?<bank_identifier>\d{5})(?<branch_identifier>\d{5})(?<account_number>[A-Z0-9]{11})(?<national_check_digits>\d{2})'
108
+
109
+ ge: # Georgia
110
+ length: 22
111
+ # regexp: '[A-Z]{2}\d{16}'
112
+ regexp: '(?<bank_identifier>[A-Z]{2})(?<account_number>\d{16})'
113
+
114
+ gi: # Gibraltar
115
+ length: 23
116
+ # regexp: '[A-Z]{4}[A-Z0-9]{15}'
117
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<account_number>[A-Z0-9]{15})'
118
+
119
+ gr: # Greece
120
+ length: 27
121
+ # regexp: '\d{7}[A-Z0-9]{16}'
122
+ regexp: '(?<bank_identifier>\d{4})(?<branch_identifier>\d{3})(?<account_number>[A-Z0-9]{16})'
123
+
124
+ gt: # Guatemala
125
+ length: 28
126
+ # regexp: '[A-Z0-9]{4}[A-Z0-9]{20}'
127
+ regexp: '(?<bank_identifier>[A-Z0-9]{4})(?<account_number>[A-Z0-9]{20})'
128
+
129
+ hu: # Hungary
130
+ length: 28
131
+ # regexp: '\d{24}'
132
+ regexp: '(?<bank_identifier>\d{3})(?<branch_identifier>\d{4})(?<account_number>\d{1}\d{15})(?<national_check_digits>\d{1})'
133
+
134
+ is: # Iceland
135
+ length: 26
136
+ # regexp: '\d{22}'
137
+ regexp: '(?<bank_identifier>\d{4})(?<branch_identifier>\d{2})(?<account_number>\d{6}\d{10})'
138
+
139
+ ie: # Ireland
140
+ length: 22
141
+ # regexp: '[A-Z0-9]{4}\d{14}'
142
+ regexp: '(?<bank_identifier>[A-Z0-9]{4})(?<branch_identifier>\d{6})(?<account_number>\d{8})'
143
+
144
+ il: # Israel
145
+ length: 23
146
+ # regexp: '\d{19}'
147
+ regexp: '(?<bank_identifier>\d{3})(?<branch_identifier>\d{3})(?<account_number>\d{13})'
148
+
149
+ it: # Italy
150
+ length: 27
151
+ # regexp: '[A-Z]\d{10}[A-Z0-9]{12}'
152
+ regexp: '(?<national_check_digits>[A-Z])(?<bank_identifier>\d{5})(?<branch_identifier>\d{5})(?<account_number>[A-Z0-9]{12})'
153
+
154
+ kz: # Kazakhstan
155
+ length: 20
156
+ # regexp: '\d{3}[A-Z0-9]{13}'
157
+ regexp: '(?<bank_identifier>\d{3})(?<account_number>[A-Z0-9]{13})'
158
+
159
+ kw: # Kuwait
160
+ length: 30
161
+ # regexp: '[A-Z]{4}[A-Z0-9]{22}'
162
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<account_number>[A-Z0-9]{22})'
163
+
164
+ lv: # Latvia
165
+ length: 21
166
+ # regexp: '[A-Z]{4}[A-Z0-9]{13}'
167
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<account_number>[A-Z0-9]{13})'
168
+
169
+ lb: # Lebanon
170
+ length: 28
171
+ # regexp: '\d{4}[A-Z0-9]{20}'
172
+ regexp: '(?<bank_identifier>\d{4})(?<account_number>[A-Z0-9]{20})'
173
+
174
+ li: # Liechtenstein
175
+ length: 21
176
+ # regexp: '\d{5}[A-Z0-9]{12}'
177
+ regexp: '(?<bank_identifier>\d{5})(?<account_number>[A-Z0-9]{12})'
178
+
179
+ lt: # Lithuania
180
+ length: 20
181
+ # regexp: '\d{16}'
182
+ regexp: '(?<bank_identifier>\d{5})(?<account_number>\d{11})'
183
+
184
+ lu: # Luxembourg
185
+ length: 20
186
+ # regexp: '\d{3}[A-Z0-9]{13}'
187
+ regexp: '(?<bank_identifier>\d{3})(?<account_number>[A-Z0-9]{13})'
188
+
189
+ mk: # Macedonia
190
+ length: 19
191
+ # regexp: '\d{3}[A-Z0-9]{10}\d{2}'
192
+ regexp: '(?<branch_identifier>\d{3})(?<account_number>[A-Z0-9]{10})(?<national_check_digits>\d{2})'
193
+
194
+ mt: # Malta
195
+ length: 31
196
+ # regexp: '[A-Z]{4}\d{5}[A-Z0-9]{18}'
197
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<branch_identifier>\d{5})(?<account_number>[A-Z0-9]{18})'
198
+
199
+ mr: # Mauritania
200
+ length: 27
201
+ # regexp: '\d{23}'
202
+ regexp: '(?<bank_identifier>\d{5})(?<branch_identifier>\d{5})(?<account_number>\d{11})(?<national_check_digits>\d{2})'
203
+
204
+ mu: # Mauritius
205
+ length: 30
206
+ # regexp: '[A-Z]{4}\d{19}[A-Z]{3}'
207
+ regexp: '(?<bank_identifier>[A-Z]{4}\d{2})(?<branch_identifier>\d{2})(?<account_number>\d{12}\d{3}[A-Z]{3})'
208
+
209
+ mc: # Monaco
210
+ length: 27
211
+ # regexp: '\d{10}[A-Z0-9]{11}\d{2}'
212
+ regexp: '(?<bank_identifier>\d{5})(?<branch_identifier>\d{5})(?<account_number>[A-Z0-9]{11})(?<national_check_digits>\d{2})'
213
+
214
+ md: # Moldova
215
+ length: 24
216
+ # regexp: '[A-Z0-9]{2}\d{18}'
217
+ regexp: '(?<bank_identifier>[A-Z0-9]{2})(?<account_number>\d{18})'
218
+
219
+ me: # Montenegro
220
+ length: 22
221
+ # regexp: '\d{18}'
222
+ regexp: '(?<bank_identifier>\d{3})(?<account_number>(\d{13})(\d{2}))'
223
+
224
+ nl: # Netherlands
225
+ length: 18
226
+ # regexp: '[A-Z]{4}\d{10}'
227
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<account_number>\d{10})'
228
+
229
+ 'no': # Norway
230
+ length: 15
231
+ # regexp: '\d{11}'
232
+ regexp: '(?<bank_identifier>\d{4})(?<account_number>(\d{6})(\d{1}))'
233
+
234
+ pk: # Pakistan
235
+ length: 24
236
+ # regexp: '[A-Z0-9]{4}\d{16}'
237
+ regexp: '(?<bank_identifier>[A-Z0-9]{4})(?<account_number>\d{16})'
238
+
239
+ ps: # Palestine
240
+ length: 29
241
+ # regexp: '[A-Z0-9]{4}\d{21}'
242
+ regexp: '(?<bank_identifier>[A-Z0-9]{4})(?<account_number>\d{21})'
243
+
244
+ pl: # Poland
245
+ length: 28
246
+ # regexp: '\d{24}'
247
+ regexp: '(?<bank_identifier>\d{8})(?<account_number>\d{16})'
248
+
249
+ pt: # Portugal
250
+ length: 25
251
+ # regexp: '\d{21}'
252
+ regexp: '(?<bank_identifier>\d{4})(?<branch_identifier>\d{4})(?<account_number>\d{11})(?<national_check_digits>\d{2})'
253
+
254
+ ro: # Romania
255
+ length: 24
256
+ # regexp: '[A-Z]{4}[A-Z0-9]{16}'
257
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<account_number>[A-Z0-9]{16})'
258
+
259
+ sm: # San Marino
260
+ length: 27
261
+ # regexp: '[A-Z]\d{10}[A-Z0-9]{12}'
262
+ regexp: '(?<national_check_digits>[A-Z])(?<bank_identifier>\d{5})(?<branch_identifier>\d{5})(?<account_number>[A-Z0-9]{12})'
263
+
264
+ sa: # Saudi Arabia
265
+ length: 24
266
+ # regexp: '\d{2}[A-Z0-9]{18}'
267
+ regexp: '(?<bank_identifier>\d{2})(?<account_number>[A-Z0-9]{18})'
268
+
269
+ rs: # Serbia
270
+ length: 22
271
+ # regexp: '\d{18}'
272
+ regexp: '(?<bank_identifier>\d{3})(?<account_number>\d{13})(?<national_check_digits>\d{2})'
273
+
274
+ sk: # Slovak Republic
275
+ length: 24
276
+ # regexp: '\d{20}'
277
+ regexp: '(?<bank_identifier>\d{4})(?<branch_identifier>\d{6})(?<account_number>\d{10})'
278
+
279
+ si: # Slovenia
280
+ length: 19
281
+ # regexp: '\d{15}'
282
+ regexp: '(?<bank_identifier>\d{5})(?<account_number>\d{8})(?<national_check_digits>\d{2})'
283
+
284
+ es: # Spain
285
+ length: 24
286
+ # regexp: '\d{20}'
287
+ regexp: '(?<bank_identifier>\d{4})(?<branch_identifier>\d{4})(?<national_check_digits>\d{1}\d{1})(?<account_number>\d{10})'
288
+
289
+ se: # Sweden
290
+ length: 24
291
+ # regexp: '\d{20}'
292
+ regexp: '(?<bank_identifier>\d{3})(?<account_number>\d{16}\d{1})'
293
+
294
+ ch: # Switzerland
295
+ length: 21
296
+ # regexp: '\d{5}[A-Z0-9]{12}'
297
+ regexp: '(?<bank_identifier>\d{5})(?<account_number>[A-Z0-9]{12})'
298
+
299
+ tn: # Tunisia
300
+ length: 24
301
+ # regexp: '\d{20}'
302
+ regexp: '(?<bank_identifier>\d{2})(?<branch_identifier>\d{3})(?<account_number>\d{13}\d{2})'
303
+
304
+ tr: # Turkey
305
+ length: 26
306
+ # regexp: '\d{5}[A-Z0-9]{17}'
307
+ regexp: '(?<bank_identifier>\d{5})([A-Z0-9])(?<account_number>[A-Z0-9]{16})'
308
+
309
+ ae: # United Arab Emirates
310
+ length: 23
311
+ # regexp: '\d{3}\d{16}'
312
+ regexp: '(?<bank_identifier>\d{3})(?<account_number>\d{16})'
313
+
314
+ gb: # United Kingdom
315
+ length: 22
316
+ # regexp: '[A-Z]{4}\d{14}'
317
+ regexp: '(?<bank_identifier>[A-Z]{4})(?<branch_identifier>\d{6})(?<account_number>\d{8})'
318
+
319
+ vg: # Virgin Islands, British
320
+ length: 24
321
+ # regexp: '[A-Z0-9]{4}\d{16}'
322
+ regexp: '(?<bank_identifier>[A-Z0-9]{4})(?<account_number>\d{16})'
323
+
324
+ # In addition to the above list, Nordea has catalogued IBANs for countries listed below.[32]
325
+
326
+ ao: # Angola
327
+ length: 25
328
+ # regexp: '\d{21}'
329
+ regexp: '\d{21}'
330
+
331
+ bj: # Benin
332
+ length: 28
333
+ # regexp: '[A-Z]\d{23}'
334
+ regexp: '[A-Z]\d{23}'
335
+
336
+ bf: # Burkina Faso
337
+ length: 27
338
+ # regexp: '\d{23}'
339
+ regexp: '\d{23}'
340
+
341
+ bi: # Burundi
342
+ length: 16
343
+ # regexp: '\d{12}'
344
+ regexp: '\d{12}'
345
+
346
+ cm: # Cameroon
347
+ length: 27
348
+ # regexp: '\d{23}'
349
+ regexp: '\d{23}'
350
+
351
+ cv: # Cape Verde
352
+ length: 25
353
+ # regexp: '\d{21}'
354
+ regexp: '\d{21}'
355
+
356
+ ir: # Iran
357
+ length: 26
358
+ # regexp: '\d{22}'
359
+ regexp: '\d{22}'
360
+
361
+ ci: # Ivory Coast
362
+ length: 28
363
+ # regexp: '[A-Z]\d{23}'
364
+ regexp: '[A-Z]\d{23}'
365
+
366
+ mg: # Madagascar
367
+ length: 27
368
+ # regexp: '\d{23}'
369
+ regexp: '\d{23}'
370
+
371
+ ml: # Mali
372
+ length: 28
373
+ # regexp: '[A-Z]\d{23}'
374
+ regexp: '[A-Z]\d{23}'
375
+
376
+ mz: # Mozambique
377
+ length: 25
378
+ # regexp: '\d{21}'
379
+ regexp: '\d{21}'
380
+
381
+ sn: # Senegal
382
+ length: 28
383
+ # regexp: '[A-Z]\d{23}'
384
+ regexp: '[A-Z]\d{23}'
385
+
386
+ # not quite sure about these:
387
+
388
+ # cg: # Republic Congo
389
+ # length: 27
390
+ # # regexp: ''
391
+ #
392
+ # dz: # Algeria
393
+ # length: 24
394
+ # # regexp: ''
395
+ #
396
+ # eg: # Egypt
397
+ # length: 27
398
+ # # regexp: ''
399
+ #
400
+ # ga: # Gabun
401
+ # length: 27
402
+ # # regexp: ''
403
+ #
404
+ # ua: # Ukraine
405
+ # length: 29
406
+ ## regexp: ''
data/lib/bank.rb ADDED
@@ -0,0 +1,9 @@
1
+ require "bank/version"
2
+ require "pathname"
3
+ require "yaml"
4
+
5
+ module Bank
6
+ def self.load_specifications(name)
7
+ YAML.load_file Pathname.new(__FILE__).dirname.parent + "data" + "#{name}.yml"
8
+ end
9
+ end
data/lib/bank/bban.rb ADDED
@@ -0,0 +1,40 @@
1
+ require 'bank'
2
+
3
+ module Bank
4
+ class BBAN # Basic Bank Account Number
5
+ def initialize(country_code, code)
6
+ @country_code, @code = country_code, code
7
+ end
8
+
9
+ def to_s
10
+ @code
11
+ end
12
+
13
+ def valid?
14
+ valid_length? && !data.nil?
15
+ end
16
+
17
+ # the bban is the iban minus the first 4 characters (country_code, check_digits)
18
+ def valid_length?
19
+ specification && specification['length'] - 4 == @code.length
20
+ end
21
+
22
+ [:account_number, :bank_identifier, :branch_identifier].each do |m|
23
+ define_method(m) { data && data[m] }
24
+ end
25
+
26
+ private
27
+
28
+ def data
29
+ @code.match(/^#{specification['regexp']}$/) if specification
30
+ end
31
+
32
+ def specification
33
+ @specification ||= self.class.specifications[@country_code.downcase]
34
+ end
35
+
36
+ def self.specifications
37
+ @@specs ||= Bank.load_specifications(:iban)
38
+ end
39
+ end
40
+ end
data/lib/bank/bic.rb ADDED
@@ -0,0 +1,67 @@
1
+ require "bank/validators/bic_validator" if defined? ActiveModel
2
+
3
+ module Bank
4
+ class BIC
5
+
6
+ def self.valid?(code)
7
+ new(code).valid?
8
+ end
9
+
10
+ def initialize(code)
11
+ @code = code.to_s.strip.gsub(/\s+/, '').upcase
12
+ end
13
+
14
+ def bank_code
15
+ @code[0..3]
16
+ end
17
+
18
+ def country_code
19
+ @code[4..5]
20
+ end
21
+
22
+ def location_code
23
+ @code[6..7]
24
+ end
25
+
26
+ def branch_code
27
+ @code[8..10]
28
+ end
29
+
30
+ def to_s(formatted=false)
31
+ formatted ? "#{bank_code} #{country_code} #{location_code} #{branch_code}".strip : @code
32
+ end
33
+
34
+ def test?
35
+ location_code[1] == '0'
36
+ end
37
+
38
+ def passive?
39
+ location_code[1] == '1'
40
+ end
41
+
42
+ def reverse_billing?
43
+ location_code[1] == '2'
44
+ end
45
+
46
+ def valid?
47
+ valid_length? && valid_format? && valid_location_code? && valid_branch_code?
48
+ end
49
+
50
+ def valid_length?
51
+ @code.length == 8 || @code.length == 11
52
+ end
53
+
54
+ def valid_format?
55
+ @code =~ /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/
56
+ end
57
+
58
+ def valid_location_code?
59
+ location_code[0] != '0' && location_code[0] != '1' && location_code[1] != 'O'
60
+ end
61
+
62
+ def valid_branch_code?
63
+ branch_code.nil? || !(branch_code[0] == 'X' && branch_code != 'XXX')
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,33 @@
1
+ require 'bank/iban'
2
+ require 'bank/bic'
3
+
4
+ module Bank
5
+ class Contact
6
+ attr_reader :iban, :bic
7
+
8
+ def initialize(iban, bic)
9
+ self.iban = iban
10
+ self.bic = bic
11
+ end
12
+
13
+ def iban=(value)
14
+ @iban = IBAN.new(value)
15
+ end
16
+
17
+ def bic=(value)
18
+ @bic = BIC.new(value)
19
+ end
20
+
21
+ def valid?
22
+ iban.valid? && bic.valid?
23
+ end
24
+
25
+ def to_h
26
+ { iban: iban.to_s, bic: bic.to_s }
27
+ end
28
+
29
+ def to_a
30
+ to_h.values
31
+ end
32
+ end
33
+ end
data/lib/bank/iban.rb ADDED
@@ -0,0 +1,46 @@
1
+ require "forwardable"
2
+ require "bank/bban"
3
+ require "bank/validators/iban_validator" if defined? ActiveModel
4
+
5
+ module Bank
6
+ class IBAN # International Bank Account Number
7
+ extend Forwardable
8
+ def_delegators :bban, :account_number, :bank_identifier, :branch_identifier
9
+
10
+ def self.valid?(code)
11
+ new(code).valid?
12
+ end
13
+
14
+ def initialize(code)
15
+ @code = code.to_s.strip.gsub(/\s+/, '').upcase
16
+ end
17
+
18
+ def country_code
19
+ @code[0..1]
20
+ end
21
+
22
+ def check_digits
23
+ @code[2..3]
24
+ end
25
+
26
+ def bban
27
+ @bban ||= BBAN.new(country_code, @code[4..-1])
28
+ end
29
+
30
+ def valid?
31
+ valid_check_digits? && bban.valid?
32
+ end
33
+
34
+ def valid_check_digits?
35
+ to_i % 97 == 1
36
+ end
37
+
38
+ def to_i
39
+ "#{bban}#{country_code}#{check_digits}".each_char.map { |chr| chr.to_i(36) }.join.to_i
40
+ end
41
+
42
+ def to_s(formatted=false)
43
+ formatted ? @code.gsub(/(.{4})/, '\1 ').strip : @code
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,7 @@
1
+ require 'active_model/validator'
2
+
3
+ class BicValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ record.errors.add(attribute, :invalid) unless BIC.valid?(value)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'active_model/validator'
2
+
3
+ class IbanValidator < ActiveModel::EachValidator
4
+ def validate_each(record, attribute, value)
5
+ record.errors.add(attribute, :invalid) unless Bank::IBAN.valid?(value)
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module Bank
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ class Company
4
+ include ActiveModel::Model
5
+
6
+ attr_accessor :iban, :name
7
+ validates :iban, iban: true
8
+
9
+ def persisted?
10
+ false
11
+ end
12
+ end
13
+
14
+ class Person
15
+ include ActiveModel::Model
16
+
17
+ attr_accessor :iban
18
+ validates :iban, iban: true, allow_nil: true
19
+
20
+ def persisted?
21
+ false
22
+ end
23
+ end
24
+
25
+
26
+ describe IbanValidator do
27
+ before {
28
+ @model = Company.new
29
+ }
30
+
31
+ it "should be valid" do
32
+ @model.iban = 'FR1420041010050500013M02606'
33
+ @model.valid?.must_equal true
34
+ end
35
+
36
+ it "should not be valid" do
37
+ @model.iban = 'FR1420041010050500013'
38
+ @model.valid?.must_equal false
39
+ @model.errors[:iban].must_include "is invalid"
40
+ end
41
+
42
+ it "should not validate with nil value" do
43
+ @model.iban.must_equal nil
44
+ @model.valid?.must_equal false
45
+ end
46
+
47
+ it "should not use the validator with option allow_nil: true" do
48
+ @person = Person.new
49
+ @person.iban.must_equal nil
50
+ @person.valid?.must_equal true
51
+ end
52
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ require 'bank/contact'
4
+
5
+ describe Bank::Contact do
6
+ before do
7
+ @iban = Bank::IBAN.new('FR14 2004 1010 0505 0001 3M026 06')
8
+ @bic = Bank::BIC.new('BYLADEM1203')
9
+ @contact = Bank::Contact.new(@iban, @bic)
10
+ end
11
+
12
+ it "should validate" do
13
+ @contact.valid?.must_equal true
14
+ end
15
+
16
+ it "should have the right types" do
17
+ @contact.iban.must_be_kind_of Bank::IBAN
18
+ @contact.bic.must_be_kind_of Bank::BIC
19
+ end
20
+
21
+ it "should export to_h" do
22
+ @contact.to_h.must_equal({iban: "FR1420041010050500013M02606", bic: "BYLADEM1203"})
23
+ end
24
+
25
+ it "should export to_a" do
26
+ @contact.to_a.must_equal(["FR1420041010050500013M02606", "BYLADEM1203"])
27
+ end
28
+
29
+ end
data/spec/iban_spec.rb ADDED
@@ -0,0 +1,150 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe Bank::IBAN do
5
+ before do
6
+ @iban = Bank::IBAN.new('FR14 2004 1010 0505 0001 3M026 06')
7
+ end
8
+
9
+ it "should valid from class method" do
10
+ Bank::IBAN.valid?('FR14 2004 1010 0505 0001 3M026 06').must_equal true
11
+ end
12
+
13
+ it "should load the validation rules" do
14
+ Bank.load_specifications(:iban).wont_be :empty?
15
+ Bank.load_specifications(:iban).must_be_kind_of Hash
16
+ end
17
+
18
+ it "should return the county code" do
19
+ @iban.country_code.must_equal "FR"
20
+ end
21
+
22
+ it "should return the check digits" do
23
+ @iban.check_digits.must_equal "14"
24
+ end
25
+
26
+ it "should return the BBAN" do
27
+ @iban.bban.must_be_kind_of Bank::BBAN
28
+ @iban.bban.to_s.must_equal "20041010050500013M02606"
29
+ end
30
+
31
+ it "should convert to integer value" do
32
+ @iban.to_i.must_equal 200410100505000132202606152714
33
+ end
34
+
35
+ it "should convert to string" do
36
+ @iban.to_s.must_equal 'FR1420041010050500013M02606'
37
+ end
38
+
39
+ it "should convert to formatted string" do
40
+ @iban.to_s(true).must_equal 'FR14 2004 1010 0505 0001 3M02 606'
41
+ end
42
+
43
+ it "should respond_to? account_number" do
44
+ @iban.respond_to?(:account_number).must_equal true
45
+ end
46
+
47
+ it "should return account_number" do
48
+ @iban.account_number.must_equal "0500013M026"
49
+ end
50
+
51
+ it "should return bank_identifier" do
52
+ @iban.bank_identifier.must_equal "20041"
53
+ end
54
+
55
+ it "should return branch_identifier" do
56
+ @iban.branch_identifier.must_equal "01005"
57
+ end
58
+
59
+ [
60
+ "AL47212110090000000235698741",
61
+ "AD12 00012030200359100100",
62
+ "AT611904300234573201",
63
+ "BE68539007547034",
64
+ "BA391290079401028494",
65
+ "BG80BNBG96611020345678",
66
+ "HR1210010051863000160",
67
+ "CY17002001280000001200527600",
68
+ "CZ6508000000192000145399",
69
+ "DK5000400440116243",
70
+ "EE382200221020145685",
71
+ "FO1464600009692713",
72
+ "FI2112345600000785",
73
+ "FR1420041010050500013M02606",
74
+ "GE29NB0000000101904917",
75
+ "DE89370400440532013000",
76
+ "GI75NWBK000000007099453",
77
+ "GR1601101250000000012300695",
78
+ "GL8964710001000206",
79
+ "HU42117730161111101800000000",
80
+ "IS140159260076545510730339",
81
+ "IE29AIBK93115212345678",
82
+ "IT60X0542811101000000123456",
83
+ "LV80BANK0000435195001",
84
+ "LI21088100002324013AA",
85
+ "LT121000011101001000",
86
+ "LU280019400644750000",
87
+ "MK07300000000042425",
88
+ "MT84MALT011000012345MTLCAST001S",
89
+ "MD24AG000225100013104168",
90
+ "MC5813488000010051108001292",
91
+ "ME25505000012345678951",
92
+ "NL91ABNA0417164300",
93
+ "NO9386011117947",
94
+ "PL27114020040000300201355387",
95
+ "PT50000201231234567890154",
96
+ "RO49AAAA1B31007593840000",
97
+ "SM86U0322509800000000270100",
98
+ "RS35260005601001611379",
99
+ "SK3112000000198742637541",
100
+ "SI56191000000123438",
101
+ "ES9121000418450200051332",
102
+ "SE3550000000054910000003",
103
+ "CH9300762011623852957",
104
+ #"UA573543470006762462054925026",
105
+ "GB29NWBK60161331926819",
106
+ #"DZ4000400174401001050486",
107
+ "AO06000600000100037131174",
108
+ "AZ21NABZ00000000137010001944",
109
+ "BH29BMAG1299123456BH00",
110
+ "BJ11B00610100400271101192591",
111
+ "BR9700360305000010009795493P1",
112
+ "VG96VPVG0000012345678901",
113
+ "BF1030134020015400945000643",
114
+ "BI43201011067444",
115
+ "CM2110003001000500000605306",
116
+ "CV64000300004547069110176",
117
+ "FR7630007000110009970004942",
118
+ #"CG5230011000202151234567890",
119
+ "CR0515202001026284066",
120
+ "DO28BAGR00000001212453611324",
121
+ #"EG1100006001880800100014553",
122
+ #"GA2140002000055602673300064",
123
+ "GT82TRAJ01020000001210029690",
124
+ "IR580540105180021273113007",
125
+ "IL620108000000099999999",
126
+ "CI05A00060174100178530011852",
127
+ "KZ176010251000042993",
128
+ "KW74NBOK0000000000001000372151",
129
+ "LB30099900000001001925579115",
130
+ "MG4600005030010101914016056",
131
+ "ML03D00890170001002120000447",
132
+ "MR1300012000010000002037372",
133
+ "MU17BOMM0101101030300200000MUR",
134
+ "MZ59000100000011834194157",
135
+ "PK24SCBL0000001171495101",
136
+ "PS92PALS000000000400123456702",
137
+ "PT50000200000163099310355",
138
+ "SA0380000000608010167519",
139
+ "SN12K00100152000025690007542",
140
+ "TN5914207207100707129648",
141
+ "TR330006100519786457841326",
142
+ "AE260211000000230064016"
143
+ ].each do |code|
144
+ describe code do
145
+ it "should be valid" do
146
+ Bank::IBAN.new(code).valid?.must_equal true
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+
5
+ require 'minitest/autorun'
6
+ require 'minitest/spec'
7
+ begin; require 'turn/autorun'; rescue LoadError; end
8
+
9
+ require 'active_model'
10
+ require 'bank/iban'
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bank-contact
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Kevin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.5'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '4.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '4.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activemodel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 4.0.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 4.0.0
69
+ description: 'IBAN + SWIFT/BIC: Information, Validation and Formatting.'
70
+ email:
71
+ - kevin.melchert@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".travis.yml"
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - README.md
81
+ - Rakefile
82
+ - bank.gemspec
83
+ - data/iban.yml
84
+ - lib/bank.rb
85
+ - lib/bank/bban.rb
86
+ - lib/bank/bic.rb
87
+ - lib/bank/contact.rb
88
+ - lib/bank/iban.rb
89
+ - lib/bank/validators/bic_validator.rb
90
+ - lib/bank/validators/iban_validator.rb
91
+ - lib/bank/version.rb
92
+ - spec/activemodel_spec.rb
93
+ - spec/contact_spec.rb
94
+ - spec/iban_spec.rb
95
+ - spec/spec_helper.rb
96
+ homepage: ''
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.2.0
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: IBAN + SWIFT/BIC
120
+ test_files:
121
+ - spec/activemodel_spec.rb
122
+ - spec/contact_spec.rb
123
+ - spec/iban_spec.rb
124
+ - spec/spec_helper.rb