bic 0.0.1 → 0.0.2
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.
- data/.rspec +2 -0
- data/Gemfile +6 -0
- data/lib/bic.rb +9 -2
- data/lib/bic/faker.rb +55 -0
- data/lib/bic/validation.rb +63 -0
- data/lib/bic/version.rb +3 -1
- data/spec/lib/faker_spec.rb +14 -0
- data/spec/lib/validation_spec.rb +87 -0
- data/spec/spec_helper.rb +5 -0
- metadata +11 -2
data/.rspec
ADDED
data/Gemfile
CHANGED
data/lib/bic.rb
CHANGED
@@ -1,5 +1,12 @@
|
|
1
|
-
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
3
|
module Bic
|
4
|
-
#
|
4
|
+
# длина БИК
|
5
|
+
BIC_LENGTH = 9
|
6
|
+
|
7
|
+
# длина номера счета
|
8
|
+
ACCOUNT_LENGTH = 20
|
5
9
|
end
|
10
|
+
|
11
|
+
|
12
|
+
Dir[File.expand_path("../bic/**rb", __FILE__)].each { |f| require f }
|
data/lib/bic/faker.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path("../validation", __FILE__)
|
4
|
+
|
5
|
+
module Bic
|
6
|
+
module Faker
|
7
|
+
class << self
|
8
|
+
include Bic::Validation
|
9
|
+
|
10
|
+
# http://ru.wikipedia.org/wiki/Банковский_идентификационный_код
|
11
|
+
def bic(options = {})
|
12
|
+
# код Российской Федерации
|
13
|
+
country_code = "04"
|
14
|
+
|
15
|
+
# код территории Российской Федерации в соответствии с разрядами 1 и 2 ОК 019-95 (ОКАТО)
|
16
|
+
# 00 обозначает не РФ.
|
17
|
+
territory_code = "%02d" % rand(1...99)
|
18
|
+
|
19
|
+
# условный номер подразделения расчетной сети Банка России, уникальный в рамках
|
20
|
+
# территориального учреждения Банка России, в составе которого действует данное
|
21
|
+
# подразделение расчетной сети Банка России, или условный номер структурного
|
22
|
+
# подразделения Банка России — принимает цифровые значения от „00“ до „99“
|
23
|
+
dept_code = "%02d" % rand(0...99)
|
24
|
+
|
25
|
+
# условный номер кредитной организации (филиала) в подразделении расчетной сети
|
26
|
+
# Банка России, в котором открыт ее (его) корреспондентский счет (субсчет),
|
27
|
+
# принимает цифровые значения от „050“ до „999“
|
28
|
+
|
29
|
+
# Для расчётно-кассового центра или другого подразделения в составе территориального учреждения Банка России,
|
30
|
+
# наделённого функциями расчётно-кассового (кассового) центра, в данных разрядах указывается значение „000“.
|
31
|
+
|
32
|
+
# Для Головного расчётно-кассового центра или другого подразделения в составе территориального учреждения Банка России,
|
33
|
+
# наделённого функциями Головного расчётно-кассового центра, в данных разрядах указывается значение „001“.
|
34
|
+
|
35
|
+
# Для других подразделений расчётной сети Банка России и структурных подразделений Банка России в данных разрядах указывается значение „002“.
|
36
|
+
org_code = "%03d" % rand(50...999)
|
37
|
+
|
38
|
+
# собираем сам код
|
39
|
+
[country_code, territory_code, dept_code, org_code].join
|
40
|
+
end
|
41
|
+
|
42
|
+
# http://ru.wikipedia.org/wiki/Расчётный_счёт
|
43
|
+
def account(bic)
|
44
|
+
return nil unless valid_bic?(bic)
|
45
|
+
|
46
|
+
acc = (0...Bic::ACCOUNT_LENGTH).map{ rand(10) }.join
|
47
|
+
(0..9).each do |i|
|
48
|
+
acc[8] = i.to_s # 9-ое число - контрольная цифра
|
49
|
+
return acc if valid_account?(bic, acc)
|
50
|
+
end
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path("../../bic", __FILE__)
|
4
|
+
|
5
|
+
module Bic
|
6
|
+
module Validation
|
7
|
+
|
8
|
+
# правильные коды организаций
|
9
|
+
VALID_ORG_CODES = [0, 1, 2] + (50...999).to_a.freeze
|
10
|
+
|
11
|
+
# для расчета ключа
|
12
|
+
ACCOUNT_WEIGHTS = [7, 1, 3].freeze
|
13
|
+
|
14
|
+
BIC_REGEXP = Regexp.compile(/\A\d{#{Bic::BIC_LENGTH}}\z/)
|
15
|
+
ACCOUNT_REGEXP = Regexp.compile(/\A\d{#{Bic::ACCOUNT_LENGTH}}\z/)
|
16
|
+
|
17
|
+
def validate_bic(bic)
|
18
|
+
return :invalid_bic_length unless bic =~ BIC_REGEXP
|
19
|
+
|
20
|
+
country_code = bic[0..1].to_i
|
21
|
+
return :invalid_country_code unless country_code == 4
|
22
|
+
|
23
|
+
org_code = bic[6..8].to_i
|
24
|
+
return :invalid_organization_code unless VALID_ORG_CODES.include?(org_code)
|
25
|
+
|
26
|
+
:valid
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid_bic?(bic)
|
30
|
+
:valid == validate_bic(bic)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Проверка соответствия БИК номеру счета
|
34
|
+
def validate_account(bic, account)
|
35
|
+
bic_validation = validate_bic(bic)
|
36
|
+
return bic_validation unless bic_validation == :valid
|
37
|
+
|
38
|
+
return :invalid_account_length unless account =~ ACCOUNT_REGEXP
|
39
|
+
|
40
|
+
return :invalid_control_code unless valid_control_code?(bic, account)
|
41
|
+
|
42
|
+
:valid
|
43
|
+
end
|
44
|
+
|
45
|
+
# Проверка контрольного ключа
|
46
|
+
def valid_control_code?(bic, account)
|
47
|
+
return false unless bic =~ BIC_REGEXP
|
48
|
+
return false unless account =~ ACCOUNT_REGEXP
|
49
|
+
|
50
|
+
details = [bic[-3..-1], account].join
|
51
|
+
|
52
|
+
mult_results = details.split('').map.with_index do |number, i|
|
53
|
+
number.to_i * ACCOUNT_WEIGHTS[i % ACCOUNT_WEIGHTS.size]
|
54
|
+
end
|
55
|
+
|
56
|
+
(mult_results.inject(0) {|sum, value| sum + (value % 10)} % 10).zero?
|
57
|
+
end
|
58
|
+
|
59
|
+
def valid_account?(bic, account)
|
60
|
+
:valid == validate_account(bic, account)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/bic/version.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Bic::Faker do
|
5
|
+
|
6
|
+
it 'generates valid bic and account' do
|
7
|
+
bic = Bic::Faker.bic
|
8
|
+
valid_bic?(bic).should == true
|
9
|
+
|
10
|
+
account = Bic::Faker.account(bic)
|
11
|
+
valid_account?(bic, account).should == true
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Bic::Validation do
|
5
|
+
|
6
|
+
let(:valid_bic) { '044525593' }
|
7
|
+
let(:invalid_bic) { '0498057467' }
|
8
|
+
let(:valid_account) { '40108110400001020001' }
|
9
|
+
let(:invalid_account) { '406028107000000000255'}
|
10
|
+
|
11
|
+
context :validate_bic do
|
12
|
+
it 'returns :invalid_bic_length for nil object' do
|
13
|
+
validate_bic(nil).should == :invalid_bic_length
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns :invalid_bic_length when bic is shorten than needed' do
|
17
|
+
validate_bic('1' * (Bic::BIC_LENGTH - 1)).should == :invalid_bic_length
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'returns :invalid_bic_length when bic is longer than needed' do
|
21
|
+
validate_bic('1' * (Bic::BIC_LENGTH + 1)).should == :invalid_bic_length
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'returns :invalid_country_code for not russian banks' do
|
25
|
+
validate_bic('051254637').should == :invalid_country_code
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns :invalid_organization_code for not russian banks' do
|
29
|
+
validate_bic('041254005').should == :invalid_organization_code
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'returns :valid for valid bic' do
|
33
|
+
validate_bic(valid_bic).should == :valid
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context :validate_account do
|
38
|
+
|
39
|
+
it 'validates bic first' do
|
40
|
+
mock(self).validate_bic(valid_bic + '123')
|
41
|
+
validate_account(valid_bic, nil).should == :invalid_account_length
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'returns :invalid_account_length for nil object' do
|
45
|
+
validate_account(valid_bic, nil).should == :invalid_account_length
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'returns :invalid_account_length when account is shorten than needed' do
|
49
|
+
validate_account(valid_bic, '1' * (Bic::ACCOUNT_LENGTH - 1)).should == :invalid_account_length
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns :invalid_account_length when account is longer than needed' do
|
53
|
+
validate_account(valid_bic, '1' * (Bic::ACCOUNT_LENGTH + 1)).should == :invalid_account_length
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'returns :invalid_control_code when code is broken' do
|
57
|
+
validate_account(valid_bic, '40602810700000000024').should == :invalid_control_code
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'returns :valid for valid bic and account' do
|
61
|
+
validate_account(valid_bic, valid_account).should == :valid
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context :valid_bic? do
|
66
|
+
it 'calls validate_bic' do
|
67
|
+
mock(self).validate_bic(valid_bic)
|
68
|
+
valid_bic?(valid_bic).should == true
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns false for invalid_bic' do
|
72
|
+
valid_bic?(invalid_bic).should == false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context :valid_account? do
|
77
|
+
it 'calls validate_account' do
|
78
|
+
mock(self).validate_account(valid_bic, valid_account)
|
79
|
+
valid_account?(valid_bic, valid_account).should == true
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns false for invalid account' do
|
83
|
+
valid_account?(valid_bic, invalid_account).should == false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -19,13 +19,19 @@ extensions: []
|
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
21
|
- .gitignore
|
22
|
+
- .rspec
|
22
23
|
- Gemfile
|
23
24
|
- LICENSE.txt
|
24
25
|
- README.md
|
25
26
|
- Rakefile
|
26
27
|
- bic.gemspec
|
27
28
|
- lib/bic.rb
|
29
|
+
- lib/bic/faker.rb
|
30
|
+
- lib/bic/validation.rb
|
28
31
|
- lib/bic/version.rb
|
32
|
+
- spec/lib/faker_spec.rb
|
33
|
+
- spec/lib/validation_spec.rb
|
34
|
+
- spec/spec_helper.rb
|
29
35
|
homepage: ''
|
30
36
|
licenses: []
|
31
37
|
post_install_message:
|
@@ -50,4 +56,7 @@ rubygems_version: 1.8.24
|
|
50
56
|
signing_key:
|
51
57
|
specification_version: 3
|
52
58
|
summary: Библиотека для валидации банковских реквизитов
|
53
|
-
test_files:
|
59
|
+
test_files:
|
60
|
+
- spec/lib/faker_spec.rb
|
61
|
+
- spec/lib/validation_spec.rb
|
62
|
+
- spec/spec_helper.rb
|