elfproef 0.1.3 → 0.1.4

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/README.md CHANGED
@@ -2,10 +2,11 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/sytzeloor/elfproef.png?branch=master)](http://travis-ci.org/sytzeloor/elfproef)
4
4
 
5
- This gem adds two validators to your arsenal:
5
+ This gem adds three validators to your arsenal:
6
6
 
7
7
  * BsnValidator will validate Burgerservicenummers (Dutch social security numbers). It accepts both 8 and 9 digit BSN numbers.
8
8
  * BankAccountValidator will validate ING accounts (1-7 digits), and 9 or 10 digit bank account numbers using the elven-test.
9
+ * PaymentReferenceValidator will validate betalingskenmerken (Dutch payment reference numbers) using a weighted modulus 11 and a length check.
9
10
 
10
11
  ## Installation
11
12
 
@@ -35,6 +36,12 @@ Using the BankAccountValidator
35
36
  validates :account_number, bank_account: true
36
37
  end
37
38
 
39
+ Using the PaymentReferenceValidator
40
+
41
+ class User < ActiveRecord::Base
42
+ validates :reference, payment_reference: true
43
+ end
44
+
38
45
  You can also use these validators without `ActiveRecord` by including `ActiveModel::Validations`.
39
46
 
40
47
  class AwesomeDutchPerson
@@ -55,6 +62,7 @@ Add the following to your locale file:
55
62
  ATTRIBUTE:
56
63
  invalid_bank_account: "is not a valid bank account number"
57
64
  invalid_bsn: "is not a valid BSN"
65
+ invalid_payment_reference: "is not a valid payment reference"
58
66
 
59
67
  ## Bugs / Feature Requests
60
68
 
data/elfproef.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Sytze Loor", "Ariejan de Vroom"]
9
9
  s.email = ["sytze@tweedledum.nl", "ariejan@ariejan.net"]
10
10
  s.homepage = "https://github.com/sytzeloor/elfproef"
11
- s.summary = %q{Validation for Dutch bank account numbers and Citizen Service Numbers (BSN)}
12
- s.description = %q{Validation for Dutch bank account numbers and Citizen Service Numbers (BSN)}
11
+ s.summary = %q{Validation for Dutch bank account numbers, Citizen Service Numbers (BSN) and Payment reference}
12
+ s.description = %q{Validation for Dutch bank account numbers, Citizen Service Numbers (BSN) and Payment reference}
13
13
 
14
14
  s.rubyforge_project = "elfproef"
15
15
 
@@ -0,0 +1,87 @@
1
+ require 'active_model/validator'
2
+ require 'active_support/concern'
3
+
4
+ # Validates if the specified value is a valid
5
+ # payment reference number using a weighted modulus 11
6
+ class PaymentReferenceValidator < ::ActiveModel::EachValidator
7
+ extend ActiveSupport::Concern
8
+
9
+ def validate_each(record, attribute, value)
10
+ unless self.class.validate_payment_reference(value, options)
11
+ record.errors.add(attribute, :invalid_payment_reference, options)
12
+ end
13
+ end
14
+
15
+ # Takes the payment reference number and returns true if:
16
+ #
17
+ # * The number is exact 7 digits (no verification is possible)
18
+ # * Is between 9 and 14 digits, has the correct check digit and has the correct length digit
19
+ # * Is exact 16 digits and has the correct check digit
20
+ #
21
+ def self.validate_payment_reference(value, options = {})
22
+ number = value.to_s.gsub(/\D/, '').strip
23
+
24
+ # Not valid if payment reference length is < 7, 8, 15 or > 16
25
+ return false if number.length < 7 || number.length == 8 || number.length == 15 || number.length > 16
26
+
27
+ # No further verification possible for 7 digit payment references
28
+ return true if number.length == 7
29
+
30
+ # For payment references between 9 and 14 digits validate it has the correct length digit
31
+ self.validate_length_digit(number) if (9..14).include?(number.length)
32
+
33
+ # Validate the check digit
34
+ self.validate_check_digit(number)
35
+ end
36
+
37
+ private
38
+
39
+ # Validates the length digit. This is the second digit when
40
+ # a payment reference is between 9 and 14 digits
41
+ #
42
+ # Possible values:
43
+ # 7 for a 9-digit payment reference
44
+ # 8 for a 10-digit payment reference
45
+ # 9 for a 11-digit payment reference
46
+ # 0 for a 12-digit payment reference
47
+ # 1 for a 13-digit payment reference
48
+ # 2 for a 14-digit payment reference
49
+ #
50
+ def self.validate_length_digit(number)
51
+ number[1].chr.to_i == number.length - (number.length > 11 ? 12 : 2)
52
+ end
53
+
54
+ # Validates the check digit. This is the first digit when a payment
55
+ # reference is between 9 and 14 digits or is exact 16 digits
56
+ #
57
+ # The check digit is calculated using a weighted modulus 11:
58
+ #
59
+ # c123456789012345
60
+ # ABCDEFGHIJKLMNO
61
+ #
62
+ # sum = 10*A + 5*B + 8*C + 4*D + 2*E + 1*F + 6*G + 3*H + 7*I + 9*J + 10*K + 5*L + 8*M + 4*N + 2*O
63
+ # c = 11 - (sum % 11)
64
+ #
65
+ # The check digit is equal to c, with two exceptions. The check digit is
66
+ # 0 when c == 10
67
+ # 1 when c == 11
68
+ def self.validate_check_digit(number)
69
+ # Remove the first digit (check digit) from the payment reference.
70
+ # To calculate the sum we need a 15 digit payment reference,
71
+ # prefix with 0 if necessary.
72
+ reference = number[1..-1].rjust(15,"0").split("")
73
+ weights = [10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
74
+
75
+ # Calculate the sum
76
+ sum = 0
77
+ i = 0
78
+ while i < 15
79
+ sum += reference[i].to_i * weights[i]
80
+ i += 1
81
+ end
82
+ check_digit = 11 - (sum % 11)
83
+ check_digit -= 10 if check_digit >= 10
84
+
85
+ number[0].chr.to_i == check_digit
86
+ end
87
+ end
@@ -1,3 +1,3 @@
1
1
  module Elfproef
2
- VERSION= "0.1.3"
2
+ VERSION= "0.1.4"
3
3
  end
data/lib/elfproef.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  require 'elfproef/version'
2
2
  require 'elfproef/bsn_validator'
3
3
  require 'elfproef/bank_account_validator'
4
+ require 'elfproef/payment_reference_validator'
@@ -22,27 +22,37 @@ describe BankAccountValidator do
22
22
  end
23
23
 
24
24
  it "accepts 3 digit ING accounts" do
25
- subject.account = "3"
25
+ subject.account = "123"
26
26
  subject.should be_valid
27
27
  end
28
28
 
29
29
  it "accepts 4 digit ING accounts" do
30
- subject.account = "4"
30
+ subject.account = "1234"
31
31
  subject.should be_valid
32
32
  end
33
33
 
34
34
  it "accepts 5 digit ING accounts" do
35
- subject.account = "5"
35
+ subject.account = "12345"
36
36
  subject.should be_valid
37
37
  end
38
38
 
39
39
  it "accepts 6 digit ING accounts" do
40
- subject.account = "6"
40
+ subject.account = "123456"
41
41
  subject.should be_valid
42
42
  end
43
43
 
44
44
  it "accepts 7 digit ING accounts" do
45
- subject.account = "7"
45
+ subject.account = "1234567"
46
+ subject.should be_valid
47
+ end
48
+
49
+ it "accepts P-prefixed ING accounts" do
50
+ subject.account = "P123"
51
+ subject.should be_valid
52
+ end
53
+
54
+ it "accepts P-prefixed ING accounts with 7 digits" do
55
+ subject.account = "P1234567"
46
56
  subject.should be_valid
47
57
  end
48
58
 
@@ -0,0 +1,77 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ class PaymentReferenceTest
4
+ include ActiveModel::Validations
5
+ attr_accessor :reference
6
+ validates :reference, :payment_reference => true
7
+ end
8
+
9
+ describe PaymentReferenceValidator do
10
+ subject {
11
+ PaymentReferenceTest.new
12
+ }
13
+
14
+ it "accepts 7 digit payment references" do
15
+ subject.reference = "1234567"
16
+ subject.should be_valid
17
+ end
18
+
19
+ it "accepts 9 digit payment references" do
20
+ subject.reference = "173456789"
21
+ subject.should be_valid
22
+ end
23
+
24
+ it "accepts 10 digit payment references" do
25
+ subject.reference = "5834567890"
26
+ subject.should be_valid
27
+ end
28
+
29
+ it "accepts 11 digit payment references" do
30
+ subject.reference = "79345678901"
31
+ subject.should be_valid
32
+ end
33
+
34
+ it "accepts 12 digit payment references" do
35
+ subject.reference = "603456789012"
36
+ subject.should be_valid
37
+ end
38
+
39
+ it "accepts 13 digit payment references" do
40
+ subject.reference = "2134567890123"
41
+ subject.should be_valid
42
+ end
43
+
44
+ it "accepts 14 digit payment references" do
45
+ subject.reference = "02345678901234"
46
+ subject.should be_valid
47
+ end
48
+
49
+ it "accepts 16 digit payment references" do
50
+ subject.reference = "5000056789012345"
51
+ subject.should be_valid
52
+ end
53
+
54
+ it "rejects on an 6 payment references" do
55
+ subject.reference = "123456"
56
+ subject.should_not be_valid
57
+ subject.errors[:reference].should be_present
58
+ end
59
+
60
+ it "rejects on an 8 payment references" do
61
+ subject.reference = "12345678"
62
+ subject.should_not be_valid
63
+ subject.errors[:reference].should be_present
64
+ end
65
+
66
+ it "rejects on an 15 payment references" do
67
+ subject.reference = "123456789012345"
68
+ subject.should_not be_valid
69
+ subject.errors[:reference].should be_present
70
+ end
71
+
72
+ it "rejects on obviously wrong numbers" do
73
+ subject.reference = "CHUCKNORRIS"
74
+ subject.should_not be_valid
75
+ subject.errors[:reference].should be_present
76
+ end
77
+ end
metadata CHANGED
@@ -1,70 +1,82 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: elfproef
3
- version: !ruby/object:Gem::Version
4
- version: 0.1.3
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 4
9
+ version: 0.1.4
6
10
  platform: ruby
7
- authors:
11
+ authors:
8
12
  - Sytze Loor
9
13
  - Ariejan de Vroom
10
14
  autorequire:
11
15
  bindir: bin
12
16
  cert_chain: []
13
- date: 2012-05-14 00:00:00.000000000 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2012-08-30 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
16
22
  name: rake
17
- requirement: &70232266117480 !ruby/object:Gem::Requirement
18
- none: false
19
- requirements:
20
- - - ! '>='
21
- - !ruby/object:Gem::Version
22
- version: '0'
23
- type: :development
24
23
  prerelease: false
25
- version_requirements: *70232266117480
26
- - !ruby/object:Gem::Dependency
27
- name: rspec
28
- requirement: &70232266117020 !ruby/object:Gem::Requirement
29
- none: false
30
- requirements:
31
- - - ! '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
34
31
  type: :development
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec
35
35
  prerelease: false
36
- version_requirements: *70232266117020
37
- - !ruby/object:Gem::Dependency
38
- name: guard-rspec
39
- requirement: &70232266116560 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
42
- - - ! '>='
43
- - !ruby/object:Gem::Version
44
- version: '0'
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ segments:
41
+ - 0
42
+ version: "0"
45
43
  type: :development
44
+ version_requirements: *id002
45
+ - !ruby/object:Gem::Dependency
46
+ name: guard-rspec
46
47
  prerelease: false
47
- version_requirements: *70232266116560
48
- - !ruby/object:Gem::Dependency
48
+ requirement: &id003 !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ segments:
53
+ - 0
54
+ version: "0"
55
+ type: :development
56
+ version_requirements: *id003
57
+ - !ruby/object:Gem::Dependency
49
58
  name: activemodel
50
- requirement: &70232266116040 !ruby/object:Gem::Requirement
51
- none: false
52
- requirements:
53
- - - ! '>='
54
- - !ruby/object:Gem::Version
55
- version: '0'
56
- type: :runtime
57
59
  prerelease: false
58
- version_requirements: *70232266116040
59
- description: Validation for Dutch bank account numbers and Citizen Service Numbers
60
- (BSN)
61
- email:
60
+ requirement: &id004 !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ type: :runtime
68
+ version_requirements: *id004
69
+ description: Validation for Dutch bank account numbers, Citizen Service Numbers (BSN) and Payment reference
70
+ email:
62
71
  - sytze@tweedledum.nl
63
72
  - ariejan@ariejan.net
64
73
  executables: []
74
+
65
75
  extensions: []
76
+
66
77
  extra_rdoc_files: []
67
- files:
78
+
79
+ files:
68
80
  - .gitignore
69
81
  - .travis.yml
70
82
  - Gemfile
@@ -75,35 +87,44 @@ files:
75
87
  - lib/elfproef.rb
76
88
  - lib/elfproef/bank_account_validator.rb
77
89
  - lib/elfproef/bsn_validator.rb
90
+ - lib/elfproef/payment_reference_validator.rb
78
91
  - lib/elfproef/version.rb
79
92
  - spec/bank_account_validator_spec.rb
80
93
  - spec/bsn_validator_spec.rb
94
+ - spec/payment_reference_validator_spec.rb
81
95
  - spec/spec_helper.rb
96
+ has_rdoc: true
82
97
  homepage: https://github.com/sytzeloor/elfproef
83
98
  licenses: []
99
+
84
100
  post_install_message:
85
101
  rdoc_options: []
86
- require_paths:
102
+
103
+ require_paths:
87
104
  - lib
88
- required_ruby_version: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ! '>='
92
- - !ruby/object:Gem::Version
93
- version: '0'
94
- required_rubygems_version: !ruby/object:Gem::Requirement
95
- none: false
96
- requirements:
97
- - - ! '>='
98
- - !ruby/object:Gem::Version
99
- version: '0'
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ segments:
110
+ - 0
111
+ version: "0"
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ segments:
117
+ - 0
118
+ version: "0"
100
119
  requirements: []
120
+
101
121
  rubyforge_project: elfproef
102
- rubygems_version: 1.8.17
122
+ rubygems_version: 1.3.6
103
123
  signing_key:
104
124
  specification_version: 3
105
- summary: Validation for Dutch bank account numbers and Citizen Service Numbers (BSN)
106
- test_files:
125
+ summary: Validation for Dutch bank account numbers, Citizen Service Numbers (BSN) and Payment reference
126
+ test_files:
107
127
  - spec/bank_account_validator_spec.rb
108
128
  - spec/bsn_validator_spec.rb
129
+ - spec/payment_reference_validator_spec.rb
109
130
  - spec/spec_helper.rb