iban_bic 0.1.0 → 1.0.0
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 +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
|
+
[](https://rubygems.org/gems/iban_bic)
|
4
5
|
[](https://travis-ci.org/podemos-info/iban_bic)
|
5
6
|
[](https://codecov.io/gh/podemos-info/iban_bic)
|
6
7
|
[](https://scrutinizer-ci.com/g/podemos-info/iban_bic/)
|
7
8
|
[](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: {}
|