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 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