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 ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile CHANGED
@@ -2,3 +2,9 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in bic.gemspec
4
4
  gemspec
5
+
6
+ group :test do
7
+ gem 'rspec'
8
+ gem 'rr'
9
+ gem 'autotest'
10
+ end
data/lib/bic.rb CHANGED
@@ -1,5 +1,12 @@
1
- require "bic/version"
1
+ # -*- encoding : utf-8 -*-
2
2
 
3
3
  module Bic
4
- # Your code goes here...
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 }
@@ -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
@@ -1,3 +1,5 @@
1
+ # -*- encoding : utf-8 -*-
2
+
1
3
  module Bic
2
- VERSION = "0.0.1"
4
+ VERSION = "0.0.2"
3
5
  end
@@ -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
@@ -0,0 +1,5 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ require File.expand_path('../../lib/bic', __FILE__)
4
+
5
+ include Bic::Validation
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.1
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