viitenumero 0.0.2 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0e7ce3fcf81240d447d86381763b7443af1c537c
4
- data.tar.gz: 3fd6dd902c18e886f1402072ad257e776c170f2a
3
+ metadata.gz: dbddfa4ece091a8353870235c9667943118770d0
4
+ data.tar.gz: aaefedb9210111517e2b4d776f08c51dc568298b
5
5
  SHA512:
6
- metadata.gz: be8645d775a8d373a8eb1b33aeb504272fb618561442025b2bef61f8049a810b514f2aaa86dcba92670d4700beabe3fd9c747dd5eff76703f71c45dca6247705
7
- data.tar.gz: df353b5856290b84c25d13fab4e6f14af831ed33a9e252c2903803a57febcec635a772c3ba45e56122516cb9916fd9ed8ceefbecf9ba1710314975f1faa5d4e3
6
+ metadata.gz: 238cfc61b92a611e7876ec948dfde03aa672ace9843d092231cc4f2b64986569a48ec580e19ae4b24070f0b07ea31c6a9baaab5e7b67429fc2733259642bb824
7
+ data.tar.gz: adefdab209ae3cbe00e6d53af82c2a8631dfbf80af4fbf092c43c16eb9282295455d30c962d78c681eb79a755803f2341fd42d058fef570fa0e89cd581dd14ae
data/README.md CHANGED
@@ -27,15 +27,20 @@ viite = Viite.new('75310116600498132890')
27
27
  viite.valid?
28
28
  => true
29
29
 
30
+ viite.fi.to_s
31
+ => "75310116600498132890"
32
+
30
33
  viite.paper_format
31
34
  => "75310 11660 04981 32890"
32
35
 
33
- Viite.random(length: 10)
36
+ FIViite.random(length: 10).to_s
34
37
  => "3084950403"
35
38
 
36
39
  laskun_numero = 1000
37
- Viite.generate(laskun_numero)
40
+ FIViite.generate(laskun_numero).to_s
38
41
  => "10003"
42
+ RFViite.generate(laskun_numero).to_s
43
+ => "RF6810003"
39
44
 
40
45
  class Bill < ActiveRecord
41
46
  validates :reference_number, viite: true
data/lib/viitenumero.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require "viitenumero/version"
2
+ require "viitenumero/fi_viite"
3
+ require "viitenumero/rf_viite"
2
4
  require "viitenumero/viite"
3
5
 
4
6
  module Viitenumero
@@ -0,0 +1,84 @@
1
+ require 'active_model'
2
+
3
+ module Viitenumero
4
+ class FIViite
5
+ include ActiveModel::Validations
6
+
7
+ attr_reader :number
8
+
9
+ def initialize(s)
10
+ @number = format(s)
11
+ end
12
+
13
+ def paper_format
14
+ number.gsub(/.{5}(?=.)/, '\0 ')
15
+ end
16
+
17
+ def machine_format
18
+ number
19
+ end
20
+
21
+ def valid?
22
+ valid_format? and valid_length? and valid_checksum?
23
+ end
24
+
25
+ def self.generate(base)
26
+ base = (base || '').to_s.gsub(/\s+/, '')
27
+ raise ArgumentError.new('must be a number') if base.match(/\A\d+\z/).nil?
28
+ raise ArgumentError.new('must be between 3-19 chars long') if base.length < 3 || base.length > 19
29
+
30
+ FIViite.new(base + checksum(base))
31
+ end
32
+
33
+ def self.random(length: 4)
34
+ raise ArgumentError if length < 4 || length > 20
35
+ base = ''
36
+ base_length = length - 1
37
+ base = rand(10**base_length).to_s while base.length != base_length
38
+ generate(base.to_s)
39
+ end
40
+
41
+ def self.valid?(s)
42
+ FIViite.new(s).valid?
43
+ end
44
+
45
+ def to_s
46
+ machine_format
47
+ end
48
+
49
+ def to_rf
50
+ RFViite.generate(machine_format, add_fi_checksum: false)
51
+ end
52
+
53
+ private
54
+
55
+ def format(s)
56
+ r = (s || '').to_s.gsub(/\s+/, '')
57
+ r.slice!(0) while r[0] == '0'
58
+ r
59
+ end
60
+
61
+ def valid_format?
62
+ !number.match(/\A\d+\z/).nil?
63
+ end
64
+
65
+ def valid_length?
66
+ number.length >= 4 && number.length <= 20
67
+ end
68
+
69
+ def valid_checksum?
70
+ last_digit = number[-1, 1]
71
+ last_digit == self.class.checksum(number[0..-2])
72
+ end
73
+
74
+ def self.checksum(base)
75
+ weights = [7, 3, 1]
76
+ checksum, current_weight = 0, 0
77
+ base.split('').reverse.each do |digit|
78
+ checksum += digit.to_i * weights[current_weight % 3]
79
+ current_weight += 1
80
+ end
81
+ ((10 - checksum % 10) % 10).to_s
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,86 @@
1
+ require 'active_model'
2
+
3
+ module Viitenumero
4
+ # Note: Supports only ISO 11649 creditor references that are based on
5
+ # Finnish national reference numbers (see fi_viite). Does *not* support
6
+ # other SEPA countries.
7
+ class RFViite
8
+ include ActiveModel::Validations
9
+
10
+ attr_reader :number
11
+
12
+ def initialize(s)
13
+ @number = format(s)
14
+ end
15
+
16
+ def paper_format
17
+ number.gsub(/.{4}(?=.)/, '\0 ')
18
+ end
19
+
20
+ def machine_format
21
+ number
22
+ end
23
+
24
+ def valid?
25
+ valid_format? and valid_length? and valid_checksum? and valid_national_checksum?
26
+ end
27
+
28
+ def self.generate(base, add_fi_checksum: true)
29
+ base = (base || '').to_s.gsub(/\s+/, '')
30
+ raise ArgumentError.new('must be a number') if base.match(/\A\d+\z/).nil?
31
+ raise ArgumentError.new('must be between 3-19 chars long') if base.length < 3 || base.length > 19
32
+
33
+ base = base + FIViite.checksum(base) if add_fi_checksum
34
+ RFViite.new('RF' + checksum(base) + base)
35
+ end
36
+
37
+ def self.random(length: 8)
38
+ raise ArgumentError if length < 8 || length > 24
39
+ base_length = length - 4
40
+ FIViite.random(length: base_length).to_rf
41
+ end
42
+
43
+ def self.valid?(s)
44
+ RFViite.new(s).valid?
45
+ end
46
+
47
+ def to_s
48
+ machine_format
49
+ end
50
+
51
+ def to_fi
52
+ FIViite.new(national_part)
53
+ end
54
+
55
+ def national_part
56
+ number[4..-1]
57
+ end
58
+
59
+ private
60
+
61
+ def format(s)
62
+ (s || '').to_s.gsub(/\s+/, '').upcase
63
+ end
64
+
65
+ def valid_format?
66
+ !number.match(/\ARF\d+\z/).nil?
67
+ end
68
+
69
+ def valid_length?
70
+ number.length >= 8 && number.length <= 24
71
+ end
72
+
73
+ def valid_checksum?
74
+ check_digits = number[2..3]
75
+ check_digits == self.class.checksum(national_part)
76
+ end
77
+
78
+ def valid_national_checksum?
79
+ FIViite.valid?(national_part)
80
+ end
81
+
82
+ def self.checksum(base)
83
+ (98 - (base + '271500').to_i % 97).to_s.rjust(2, '0')
84
+ end
85
+ end
86
+ end
@@ -1,3 +1,3 @@
1
1
  module Viitenumero
2
- VERSION = "0.0.2"
2
+ VERSION = "1.0.2"
3
3
  end
@@ -7,37 +7,33 @@ module Viitenumero
7
7
  attr_reader :number
8
8
 
9
9
  def initialize(s)
10
- @number = format(s)
10
+ if FIViite.valid?(s)
11
+ @number = FIViite.new(s)
12
+ elsif RFViite.valid?(s)
13
+ @number = RFViite.new(s)
14
+ else
15
+ @number = FIViite.new(s)
16
+ end
11
17
  end
12
18
 
13
- def paper_format
14
- number.gsub(/.{5}(?=.)/, '\0 ')
19
+ def rf
20
+ number.is_a?(RFViite) ? number : number.to_rf
15
21
  end
16
22
 
17
- def machine_format
18
- number
23
+ def fi
24
+ number.is_a?(FIViite) ? number : number.to_fi
19
25
  end
20
26
 
21
- def valid?
22
- valid_format? and valid_length? and valid_checksum?
27
+ def paper_format
28
+ number.paper_format
23
29
  end
24
30
 
25
- def self.generate(base)
26
- base = (base || '').to_s.gsub(/\s+/, '')
27
- raise ArgumentError.new('must be a number') if base.match(/\A\d+\z/).nil?
28
- raise ArgumentError.new('must be between 3-19 chars long') if base.length < 3 || base.length > 19
29
-
30
- Viite.new(base + checksum(base))
31
+ def machine_format
32
+ number.machine_format
31
33
  end
32
34
 
33
- def self.random(opts={})
34
- opts.symbolize_keys!
35
- length = opts.fetch(:length, 4)
36
- raise ArgumentError if length < 4 || length > 20
37
- base = ''
38
- base_length = length - 1
39
- base = rand(10**base_length).to_s while base.length != base_length
40
- generate(base.to_s)
35
+ def valid?
36
+ number.valid?
41
37
  end
42
38
 
43
39
  def self.valid?(s)
@@ -47,36 +43,5 @@ module Viitenumero
47
43
  def to_s
48
44
  machine_format
49
45
  end
50
-
51
- private
52
-
53
- def format(s)
54
- r = (s || '').to_s.gsub(/\s+/, '')
55
- r.slice!(0) while r[0] == '0'
56
- r
57
- end
58
-
59
- def valid_format?
60
- !number.match(/\A\d+\z/).nil?
61
- end
62
-
63
- def valid_length?
64
- number.length >= 4 && number.length <= 20
65
- end
66
-
67
- def valid_checksum?
68
- last_digit = number[-1, 1]
69
- last_digit == self.class.checksum(number[0..-2])
70
- end
71
-
72
- def self.checksum(base)
73
- weights = [7, 3, 1]
74
- checksum, current_weight = 0, 0
75
- base.split('').reverse.each do |digit|
76
- checksum += digit.to_i * weights[current_weight % 3]
77
- current_weight += 1
78
- end
79
- ((10 - checksum % 10) % 10).to_s
80
- end
81
46
  end
82
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: viitenumero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Hanhikoski
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-08 00:00:00.000000000 Z
11
+ date: 2016-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -97,6 +97,8 @@ files:
97
97
  - bin/console
98
98
  - bin/setup
99
99
  - lib/viitenumero.rb
100
+ - lib/viitenumero/fi_viite.rb
101
+ - lib/viitenumero/rf_viite.rb
100
102
  - lib/viitenumero/version.rb
101
103
  - lib/viitenumero/viite.rb
102
104
  - lib/viitenumero/viite_validator.rb