iban_bic 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +41 -7
- data/data/iban_meta.yml +21 -21
- data/lib/generators/iban_bic/templates/iban_bic.rb.erb +1 -1
- data/lib/iban_bic/configuration.rb +1 -5
- data/lib/iban_bic/core.rb +77 -17
- data/lib/iban_bic/defaults.rb +1 -0
- data/lib/iban_bic/random.rb +32 -0
- data/lib/iban_bic/validators/countries/es.rb +5 -6
- data/lib/iban_bic/validators/countries/pt.rb +11 -0
- data/lib/iban_bic/version.rb +1 -1
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 868d6d3504a7634591fb05755ef16e2b7d97d0bf
|
4
|
+
data.tar.gz: d7d92fa69d618d303c37447ab204c4aa7d7e166c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7543c3a4b9be73644d210d1e119f82c8efc907bcd86402b4920ae6f1be63e2393e7690222ed6f720931800b5f19d1ee23ee522fc1d6ed1a4a0fac387f7fa114a
|
7
|
+
data.tar.gz: 7355d2ff4621e6a2574508cbf5987383084e5c0305c4c57f50b916c721904ec51c307805ab526409e5414967f58fa35d3fed10371c3deaf916556e2bdcea374e
|
data/README.md
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
# IBAN + BIC
|
2
2
|
When IBAN validation is not enough.
|
3
3
|
|
4
|
+
[![Gem](https://img.shields.io/gem/v/iban_bic.svg)](https://rubygems.org/gems/iban_bic)
|
4
5
|
[![Travis](https://img.shields.io/travis/podemos-info/iban_bic/master.svg)](https://travis-ci.org/podemos-info/iban_bic)
|
5
6
|
[![Codecov](https://img.shields.io/codecov/c/github/podemos-info/iban_bic.svg)](https://codecov.io/gh/podemos-info/iban_bic)
|
6
7
|
[![Scrutinizer](https://img.shields.io/scrutinizer/g/podemos-info/iban_bic.svg)](https://scrutinizer-ci.com/g/podemos-info/iban_bic/)
|
7
8
|
[![Dependency Status](https://www.versioneye.com/user/projects/59d393190fb24f0046190d85/badge.svg?style=flat-square)](https://www.versioneye.com/user/projects/59d393190fb24f0046190d85?style=flat)
|
8
9
|
|
9
10
|
## Features
|
10
|
-
* IBAN validation (`ActiveModel::EachValidator` and control digits calculator function).
|
11
|
-
* National account digits control validation (currently only ES included, others countries can be added).
|
12
|
-
* Associated tags to countries (currently only SEPA
|
11
|
+
* IBAN validation (`ActiveModel::EachValidator` and control digits calculator function) and fixing.
|
12
|
+
* National account digits control validation (currently only ES and PT are included, others countries can be added).
|
13
|
+
* Associated tags to countries (currently only SEPA and FIXED_CHECK tags are available).
|
13
14
|
* BICs mapping from IBAN bank code part: COUNTRY + BANK => BIC code.
|
14
15
|
* Currently, static data only includes some ES banks, PRs are welcomed.
|
15
16
|
* Optional database model to allow apps to dynamically add new BICs mapping.
|
17
|
+
* Random IBANs generator
|
16
18
|
|
17
19
|
## Usage
|
18
20
|
|
@@ -42,13 +44,37 @@ validates :iban, iban: { tags: [:sepa] }
|
|
42
44
|
=> {"country"=>"ES", "iban_check"=>"87", "bank"=>"0003", "branch"=>"0000", "check"=>"30", "account"=>"0000000000"}
|
43
45
|
```
|
44
46
|
|
45
|
-
4.
|
47
|
+
4. IBAN fixing (IBAN control digits and country control digits, if that code is available)
|
46
48
|
|
47
49
|
```ruby
|
48
|
-
2.4.1 :
|
50
|
+
2.4.1 :001 > IbanBic.fix("ES0000030000200000000000")
|
51
|
+
=> "ES8700030000300000000000"
|
52
|
+
```
|
53
|
+
|
54
|
+
5. BIC calculation (bank code must be in the static file or in the database)
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
2.4.1 :001 > IbanBic.calculate_bic("ES8700030000300000000000")
|
49
58
|
=> "BDEPESM1XXX"
|
50
59
|
```
|
51
60
|
|
61
|
+
6. Random IBAN generation
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
2.4.1 :001 > require "iban_bic/random"
|
65
|
+
=> true
|
66
|
+
2.4.1 :002 > IbanBic.random_iban
|
67
|
+
=> "MU52BOIR2768144336487102000AWQ"
|
68
|
+
2.4.1 :003 > IbanBic.random_iban country: "ES"
|
69
|
+
=> "ES6111051493192369291292"
|
70
|
+
2.4.1 :004 > IbanBic.random_iban tags: [:sepa]
|
71
|
+
=> "FI5584518206233159"
|
72
|
+
2.4.1 :005 > IbanBic.random_iban not_tags: [:sepa]
|
73
|
+
=> "IL317532867920826062774"
|
74
|
+
```
|
75
|
+
|
76
|
+
Note: It can't generate a valid IBAN code for some countries where iban check digits are fixed if validation code for that country is not available.
|
77
|
+
|
52
78
|
## Installation
|
53
79
|
|
54
80
|
1. Add this line to your application's Gemfile
|
@@ -90,9 +116,17 @@ $ bundle exec rails generate iban_bic:install --with-static-data
|
|
90
116
|
|
91
117
|
4. Customize initializer if needed, adding validations for new countries, or overriding YAML files.
|
92
118
|
|
93
|
-
##
|
119
|
+
## Changelog
|
120
|
+
|
121
|
+
#### 1.0.0
|
122
|
+
|
123
|
+
* Added IBAN fixing and random IBAN generator.
|
124
|
+
|
125
|
+
* Changed country checks, they must change check parts to generate the correct IBAN. Comparison against the original IBAN is made by the caller.
|
126
|
+
|
127
|
+
#### 0.1.0
|
94
128
|
|
95
|
-
*
|
129
|
+
* First version.
|
96
130
|
|
97
131
|
## Contributing
|
98
132
|
Contribution directions go here.
|
data/data/iban_meta.yml
CHANGED
@@ -12,18 +12,18 @@ AZ:
|
|
12
12
|
tags:
|
13
13
|
BA:
|
14
14
|
parts: (?<iban_check>39) (?<bank>\d{3}) (?<branch>\d{3}) (?<account>\d{8}) (?<check>\d{2})
|
15
|
-
tags:
|
15
|
+
tags: fixed_iban_check
|
16
16
|
BE:
|
17
17
|
parts: (?<iban_check>\d{2}) (?<bank>\d{3}) (?<account>\d{7}) (?<check>\d{2})
|
18
18
|
tags: sepa
|
19
19
|
BG:
|
20
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4})
|
20
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<branch>\d{4}) (?<type>\d{2}) (?<account>[A-Z0-9]{8})
|
21
21
|
tags: sepa
|
22
22
|
BH:
|
23
23
|
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<account>[A-Z0-9]{14})
|
24
24
|
tags:
|
25
25
|
BR:
|
26
|
-
parts: (?<iban_check>\d{2}) (?<bank>\d{8}) (?<branch>\d{5}) (?<account>\d{10}) [A-Z][A-Z0-9]
|
26
|
+
parts: (?<iban_check>\d{2}) (?<bank>\d{8}) (?<branch>\d{5}) (?<account>\d{10}) (?<type>[A-Z]) (?<number>[A-Z0-9])
|
27
27
|
tags:
|
28
28
|
CH:
|
29
29
|
parts: (?<iban_check>\d{2}) (?<bank>\d{5}) (?<account>[A-Z0-9]{12})
|
@@ -62,19 +62,19 @@ FR:
|
|
62
62
|
parts: (?<iban_check>\d{2}) (?<bank>\d{5}) (?<branch>\d{5}) (?<account>[A-Z0-9]{11}) (?<check>\d{2})
|
63
63
|
tags: sepa
|
64
64
|
GB:
|
65
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4})
|
65
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<branch>\d{6}) (?<account>\d{8})
|
66
66
|
tags: sepa
|
67
67
|
GE:
|
68
68
|
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{2}) (?<account>\d{16})
|
69
69
|
tags:
|
70
70
|
GI:
|
71
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4})
|
71
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<account>[A-Z0-9]{15})
|
72
72
|
tags: sepa
|
73
73
|
GR:
|
74
74
|
parts: (?<iban_check>\d{2}) (?<bank>\d{3}) (?<branch>\d{4}) (?<account>[A-Z0-9]{16})
|
75
75
|
tags: sepa
|
76
76
|
GT:
|
77
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z0-9]{4}) [A-Z0-9]{2}
|
77
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z0-9]{4}) (?<currency>[A-Z0-9]{2}) (?<type>[A-Z0-9]{2}) (?<account>[A-Z0-9]{16})
|
78
78
|
tags:
|
79
79
|
HR:
|
80
80
|
parts: (?<iban_check>\d{2}) (?<bank>\d{7}) (?<account>\d{10})
|
@@ -83,7 +83,7 @@ HU:
|
|
83
83
|
parts: (?<iban_check>\d{2}) (?<bank>\d{3}) (?<branch>\d{4}) (?<check>\d) (?<account>\d{15}) (?<check2>\d)
|
84
84
|
tags: sepa
|
85
85
|
IE:
|
86
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4})
|
86
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<branch>\d{6}) (?<account>\d{8})
|
87
87
|
tags: sepa
|
88
88
|
IL:
|
89
89
|
parts: (?<iban_check>\d{2}) (?<bank>\d{3}) (?<branch>\d{3}) (?<account>\d{13})
|
@@ -113,7 +113,7 @@ LU:
|
|
113
113
|
parts: (?<iban_check>\d{2}) (?<bank>\d{3}) (?<account>[A-Z0-9]{13})
|
114
114
|
tags: sepa
|
115
115
|
LV:
|
116
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4})
|
116
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<account>[A-Z0-9]{13})
|
117
117
|
tags: sepa
|
118
118
|
MC:
|
119
119
|
parts: (?<iban_check>\d{2}) (?<bank>\d{5}) (?<branch>\d{5}) (?<account>[A-Z0-9]{11}) (?<check>\d{2})
|
@@ -131,15 +131,15 @@ MR:
|
|
131
131
|
parts: (?<iban_check>\d{2}) (?<bank>\d{5}) (?<branch>\d{5}) (?<account>\d{11}) (?<check>\d{2})
|
132
132
|
tags:
|
133
133
|
MT:
|
134
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4})
|
134
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<branch>\d{5}) (?<account>[A-Z0-9]{18})
|
135
135
|
tags: sepa
|
136
136
|
MU:
|
137
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}\d{2}) (?<branch>\d{2}) (?<account>\d{12}) 000[A-Z]{3}
|
137
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}\d{2}) (?<branch>\d{2}) (?<account>\d{12}) (?<zeros>000) (?<currency>[A-Z]{3})
|
138
138
|
tags:
|
139
139
|
NL:
|
140
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4})
|
140
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<account>\d{10})
|
141
141
|
tags: sepa
|
142
|
-
NO:
|
142
|
+
"NO":
|
143
143
|
parts: (?<iban_check>\d{2}) (?<bank>\d{4}) (?<account>\d{6}) (?<check>\d)
|
144
144
|
tags: sepa
|
145
145
|
PK:
|
@@ -149,23 +149,23 @@ PL:
|
|
149
149
|
parts: (?<iban_check>\d{2}) (?<bank>\d{3}) (?<branch>\d{4}) (?<check>\d) (?<account>\d{16})
|
150
150
|
tags: sepa
|
151
151
|
PS:
|
152
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z0-9]{4})
|
152
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z0-9]{4}) (?<unknown>\d{9}) (?<account>\d{12})
|
153
153
|
tags:
|
154
154
|
PT:
|
155
155
|
parts: (?<iban_check>50) (?<bank>\d{4}) (?<branch>\d{4}) (?<account>\d{11}) (?<check>\d{2})
|
156
|
-
tags: sepa
|
156
|
+
tags: sepa fixed_iban_check
|
157
157
|
RO:
|
158
|
-
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4})
|
158
|
+
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<account>[A-Z0-9]{16})
|
159
159
|
tags: sepa
|
160
160
|
RS:
|
161
|
-
parts: (?<iban_check>35) (?<bank>\d{3}) (?<account>\d{13}) (?<check>\d{2})
|
162
|
-
tags:
|
161
|
+
parts: (?<iban_check>35) (?<bank>\d{3}) (?<account>\d{13}) (?<check>\d{2})
|
162
|
+
tags: fixed_iban_check
|
163
163
|
SE:
|
164
164
|
parts: (?<iban_check>\d{2}) (?<bank>\d{3}) (?<account>\d{17})
|
165
165
|
tags: sepa
|
166
166
|
SI:
|
167
167
|
parts: (?<iban_check>56) (?<bank>\d{2}) (?<branch>\d{3}) (?<account>\d{8}) (?<check>\d{2})
|
168
|
-
tags: sepa
|
168
|
+
tags: sepa fixed_iban_check
|
169
169
|
SK:
|
170
170
|
parts: (?<iban_check>\d{2}) (?<bank>\d{4}) (?<branch>\d{6}) (?<account>\d{10})
|
171
171
|
tags: sepa
|
@@ -173,10 +173,10 @@ SM:
|
|
173
173
|
parts: (?<iban_check>\d{2}) (?<check>[A-Z]) (?<bank>\d{5}) (?<branch>\d{5}) (?<account>[A-Z0-9]{12})
|
174
174
|
tags: sepa
|
175
175
|
TN:
|
176
|
-
parts: (?<iban_check>59) (?<bank>\d{2}) (?<branch>\d{3}) (?<account>\d{
|
177
|
-
tags:
|
176
|
+
parts: (?<iban_check>59) (?<bank>\d{2}) (?<branch>\d{3}) (?<account>\d{13}) (?<check>\d{2})
|
177
|
+
tags: fixed_iban_check
|
178
178
|
TR:
|
179
|
-
parts: (?<iban_check>\d{2}) (?<bank>\d{5}) 0
|
179
|
+
parts: (?<iban_check>\d{2}) (?<bank>\d{5}) (?<zeros>0) (?<account>[A-Z0-9]{16})
|
180
180
|
tags: sepa
|
181
181
|
VG:
|
182
182
|
parts: (?<iban_check>\d{2}) (?<bank>[A-Z]{4}) (?<account>\d{16})
|
@@ -5,7 +5,7 @@ IbanBic.configure do |config|
|
|
5
5
|
config.use_static_bics = <%= static_bics? %>
|
6
6
|
|
7
7
|
# add [country_code] do |parts|
|
8
|
-
# Here
|
8
|
+
# Here change the check parts (check, check2) to make other parts (bank, branch, account) satify country checks
|
9
9
|
# end
|
10
10
|
|
11
11
|
# config.iban_meta_path = "path/iban_meta.yml"
|
@@ -4,12 +4,8 @@ module IbanBic
|
|
4
4
|
class Configuration
|
5
5
|
attr_accessor :iban_meta_path, :use_static_bics, :bics_table_name, :static_bics_path
|
6
6
|
|
7
|
-
def country_validators
|
8
|
-
@country_validators ||= {}
|
9
|
-
end
|
10
|
-
|
11
7
|
def add(country)
|
12
|
-
country_validators[country] = Proc.new
|
8
|
+
IbanBic.country_validators[country] = Proc.new
|
13
9
|
end
|
14
10
|
|
15
11
|
def static_bics?
|
data/lib/iban_bic/core.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module IbanBic
|
4
|
+
@cached_variables = []
|
5
|
+
|
4
6
|
module_function
|
5
7
|
|
8
|
+
def country_validators
|
9
|
+
@country_validators ||= {}
|
10
|
+
end
|
11
|
+
|
6
12
|
def configuration
|
7
13
|
@configuration ||= Configuration.new
|
8
14
|
end
|
@@ -16,6 +22,34 @@ module IbanBic
|
|
16
22
|
parts ? ActiveSupport::HashWithIndifferentAccess[parts.names.zip(parts.captures)] : nil
|
17
23
|
end
|
18
24
|
|
25
|
+
def fix(iban)
|
26
|
+
# Fixed check IBAN parts (countries where IBAN check is always the same) must be fixed before parsing
|
27
|
+
iban, fixed_iban_check = fix_fixed_iban_check(iban)
|
28
|
+
|
29
|
+
parts = parse(iban)
|
30
|
+
return unless parts
|
31
|
+
|
32
|
+
iban = calculate_valid_country_check_iban(iban)
|
33
|
+
iban = fix_iban_check(iban) unless fixed_iban_check
|
34
|
+
|
35
|
+
iban
|
36
|
+
end
|
37
|
+
|
38
|
+
def fix_fixed_iban_check(iban)
|
39
|
+
return [iban, false] unless tags[iban[0..1]].member?(:fixed_iban_check)
|
40
|
+
|
41
|
+
result = iban.dup
|
42
|
+
result[2..3] = /\(\?\<iban_check>([^\)]*)\)/.match(iban_meta[iban[0..1]]["parts"])[1]
|
43
|
+
[result, true]
|
44
|
+
end
|
45
|
+
|
46
|
+
def fix_iban_check(iban)
|
47
|
+
result = iban.dup
|
48
|
+
result[2..3] = "00"
|
49
|
+
result[2..3] = calculate_check(result).to_s.rjust(2, "0")
|
50
|
+
result.freeze
|
51
|
+
end
|
52
|
+
|
19
53
|
def has_tags?(iban, searched_tags)
|
20
54
|
(tags[iban[0..1]] & searched_tags).any?
|
21
55
|
end
|
@@ -30,14 +64,25 @@ module IbanBic
|
|
30
64
|
end .join.to_i % 97
|
31
65
|
end
|
32
66
|
|
67
|
+
def valid?(iban)
|
68
|
+
valid_check?(iban) && valid_country_check?(iban)
|
69
|
+
end
|
70
|
+
|
33
71
|
def valid_check?(iban)
|
34
72
|
calculate_check(iban) == 97
|
35
73
|
end
|
36
74
|
|
37
|
-
def
|
75
|
+
def calculate_valid_country_check_iban(iban)
|
76
|
+
validator = country_validators[iban[0..1]]
|
77
|
+
return iban unless validator
|
78
|
+
|
38
79
|
parts = parse(iban)
|
39
|
-
validator
|
40
|
-
|
80
|
+
validator.call(parts)
|
81
|
+
parts.values.join
|
82
|
+
end
|
83
|
+
|
84
|
+
def valid_country_check?(iban)
|
85
|
+
calculate_valid_country_check_iban(iban) == iban
|
41
86
|
end
|
42
87
|
|
43
88
|
def calculate_bic(iban)
|
@@ -49,23 +94,34 @@ module IbanBic
|
|
49
94
|
end
|
50
95
|
|
51
96
|
def clear_cache
|
52
|
-
@
|
97
|
+
@cached_variables.each { |variable| instance_variable_set(variable, nil) }
|
98
|
+
@cached_variables.clear
|
99
|
+
end
|
100
|
+
|
101
|
+
def iban_meta
|
102
|
+
@iban_meta ||= ::YAML.load_file(configuration.iban_meta_path)
|
53
103
|
end
|
54
104
|
|
55
105
|
def parser
|
56
|
-
@parser ||=
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
106
|
+
@parser ||= begin
|
107
|
+
@cached_variables << :@parser
|
108
|
+
Hash[
|
109
|
+
iban_meta.map do |country, meta|
|
110
|
+
[country, /^(?<country>#{country})#{meta["parts"].delete(" ")}$/]
|
111
|
+
end
|
112
|
+
].freeze
|
113
|
+
end
|
61
114
|
end
|
62
115
|
|
63
116
|
def tags
|
64
|
-
@tags ||=
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
117
|
+
@tags ||= begin
|
118
|
+
@cached_variables << :@tags
|
119
|
+
Hash[
|
120
|
+
iban_meta.map do |country, meta|
|
121
|
+
[country, meta["tags"]&.split&.map(&:to_sym) || []]
|
122
|
+
end
|
123
|
+
].freeze
|
124
|
+
end
|
69
125
|
end
|
70
126
|
|
71
127
|
def bics
|
@@ -73,13 +129,17 @@ module IbanBic
|
|
73
129
|
end
|
74
130
|
|
75
131
|
def static_bics
|
76
|
-
@static_bics ||=
|
77
|
-
|
78
|
-
|
132
|
+
@static_bics ||= begin
|
133
|
+
@cached_variables << :@static_bics
|
134
|
+
Hash[Dir.glob(File.join(configuration.static_bics_path, "*.yml")).map do |file|
|
135
|
+
[File.basename(file).delete(".yml").upcase, YAML.load_file(file)]
|
136
|
+
end].freeze
|
137
|
+
end
|
79
138
|
end
|
80
139
|
|
81
140
|
def dynamic_bics
|
82
141
|
@dynamic_bics ||= begin
|
142
|
+
@cached_variables << :@dynamic_bics
|
83
143
|
ret = {}
|
84
144
|
Bic.find_each do |bic|
|
85
145
|
ret[bic.country] = {} unless ret[bic.country]
|
data/lib/iban_bic/defaults.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "regexp-examples"
|
4
|
+
|
5
|
+
module IbanBic
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def random_iban(options = {})
|
9
|
+
country = options[:country]
|
10
|
+
searched_tags = options[:tags]
|
11
|
+
non_searched_tags = options[:not_tags]
|
12
|
+
|
13
|
+
unless country
|
14
|
+
possible_countries = random_generator.keys
|
15
|
+
possible_countries -= IbanBic.tags.select { |_country, country_tags| (searched_tags - country_tags).any? } .keys if searched_tags.present?
|
16
|
+
possible_countries -= IbanBic.tags.select { |_country, country_tags| (non_searched_tags & country_tags).any? } .keys if non_searched_tags.present?
|
17
|
+
country = possible_countries.sample
|
18
|
+
end
|
19
|
+
IbanBic.fix(random_generator[country].random_example)
|
20
|
+
end
|
21
|
+
|
22
|
+
def random_generator
|
23
|
+
@random_generator ||= begin
|
24
|
+
@cached_variables << :@random_generator
|
25
|
+
Hash[
|
26
|
+
iban_meta.map do |country, meta|
|
27
|
+
[country, /^#{country}#{meta["parts"].delete(" ").gsub(/\(\?\<\w+\>([^\)]*)\)/, "\\1")}$/]
|
28
|
+
end
|
29
|
+
].freeze
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
def __bic_validation_proc(digits)
|
4
|
-
ret = 11 - digits.chars.each_with_index.sum { |x, i| x.to_i * 2**i } % 11
|
5
|
-
ret < 10 ? ret : 11 - ret
|
6
|
-
end
|
7
|
-
|
8
3
|
IbanBic.configure do
|
4
|
+
def __iban_bic_es_bic_validation_proc(digits)
|
5
|
+
ret = 11 - digits.chars.each_with_index.sum { |x, i| x.to_i * 2**i } % 11
|
6
|
+
ret < 10 ? ret : 11 - ret
|
7
|
+
end
|
9
8
|
add "ES" do |parts|
|
10
|
-
parts[:check]
|
9
|
+
parts[:check] = "#{__iban_bic_es_bic_validation_proc("00#{parts[:bank]}#{parts[:branch]}")}#{__iban_bic_es_bic_validation_proc(parts[:account])}"
|
11
10
|
end
|
12
11
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
IbanBic.configure do
|
4
|
+
IBAN_BIC_PT_WEIGHTS_INDEX = [73, 17, 89, 38, 62, 45, 53, 15, 50, 5, 49, 34, 81, 76, 27, 90, 9, 30, 3].freeze
|
5
|
+
|
6
|
+
add "PT" do |parts|
|
7
|
+
nib = "#{parts[:bank]}#{parts[:branch]}#{parts[:account]}"
|
8
|
+
sum = nib.chars.map(&:to_i).zip(IBAN_BIC_PT_WEIGHTS_INDEX).map { |a| a.inject(:*) } .sum
|
9
|
+
parts[:check] = 98 - sum % 97
|
10
|
+
end
|
11
|
+
end
|
data/lib/iban_bic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iban_bic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leonardo Diez
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: regexp-examples
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.3'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: codecov
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,10 +143,12 @@ files:
|
|
129
143
|
- lib/iban_bic/defaults.rb
|
130
144
|
- lib/iban_bic/engine.rb
|
131
145
|
- lib/iban_bic/models/bic.rb
|
146
|
+
- lib/iban_bic/random.rb
|
132
147
|
- lib/iban_bic/validators/countries/es.rb
|
148
|
+
- lib/iban_bic/validators/countries/pt.rb
|
133
149
|
- lib/iban_bic/version.rb
|
134
150
|
- lib/tasks/load_data.rake
|
135
|
-
homepage: https://github.
|
151
|
+
homepage: https://github.com/podemos-info/iban_bic
|
136
152
|
licenses:
|
137
153
|
- MIT
|
138
154
|
metadata: {}
|