bic 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|