valvat 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.github/workflows/ruby.yml +35 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +15 -0
- data/CHANGES.md +9 -1
- data/Gemfile +2 -0
- data/Guardfile +6 -4
- data/README.md +5 -3
- data/Rakefile +3 -1
- data/gemfiles/activemodel-5 +1 -1
- data/gemfiles/activemodel-6 +1 -1
- data/lib/active_model/validations/valvat_validator.rb +65 -32
- data/lib/valvat.rb +4 -2
- data/lib/valvat/checksum.rb +14 -13
- data/lib/valvat/checksum/at.rb +3 -1
- data/lib/valvat/checksum/be.rb +3 -1
- data/lib/valvat/checksum/bg.rb +17 -17
- data/lib/valvat/checksum/cy.rb +2 -0
- data/lib/valvat/checksum/de.rb +5 -3
- data/lib/valvat/checksum/dk.rb +3 -1
- data/lib/valvat/checksum/ee.rb +2 -0
- data/lib/valvat/checksum/es.rb +14 -16
- data/lib/valvat/checksum/fi.rb +3 -1
- data/lib/valvat/checksum/fr.rb +4 -2
- data/lib/valvat/checksum/gb.rb +46 -31
- data/lib/valvat/checksum/gr.rb +4 -2
- data/lib/valvat/checksum/hr.rb +2 -0
- data/lib/valvat/checksum/hu.rb +2 -0
- data/lib/valvat/checksum/ie.rb +5 -6
- data/lib/valvat/checksum/it.rb +6 -4
- data/lib/valvat/checksum/lt.rb +2 -0
- data/lib/valvat/checksum/lu.rb +3 -1
- data/lib/valvat/checksum/mt.rb +2 -0
- data/lib/valvat/checksum/nl.rb +5 -3
- data/lib/valvat/checksum/pl.rb +3 -1
- data/lib/valvat/checksum/pt.rb +3 -1
- data/lib/valvat/checksum/ro.rb +2 -0
- data/lib/valvat/checksum/se.rb +5 -3
- data/lib/valvat/checksum/si.rb +4 -2
- data/lib/valvat/error.rb +4 -1
- data/lib/valvat/local.rb +6 -4
- data/lib/valvat/locales/de.yml +2 -1
- data/lib/valvat/locales/en.yml +2 -1
- data/lib/valvat/locales/es.yml +1 -0
- data/lib/valvat/locales/fr.yml +1 -0
- data/lib/valvat/locales/hu.yml +1 -0
- data/lib/valvat/locales/nl.yml +1 -0
- data/lib/valvat/locales/pl.yml +1 -0
- data/lib/valvat/lookup.rb +5 -4
- data/lib/valvat/lookup/fault.rb +17 -16
- data/lib/valvat/lookup/request.rb +21 -16
- data/lib/valvat/lookup/response.rb +11 -10
- data/lib/valvat/syntax.rb +31 -30
- data/lib/valvat/utils.rb +12 -9
- data/lib/valvat/version.rb +3 -1
- data/spec/active_model/validations/valvat_validator_spec.rb +99 -93
- data/spec/spec_helper.rb +8 -8
- data/spec/valvat/checksum/at_spec.rb +6 -4
- data/spec/valvat/checksum/be_spec.rb +6 -4
- data/spec/valvat/checksum/bg_spec.rb +7 -4
- data/spec/valvat/checksum/cy_spec.rb +3 -1
- data/spec/valvat/checksum/de_spec.rb +6 -4
- data/spec/valvat/checksum/dk_spec.rb +6 -4
- data/spec/valvat/checksum/ee_spec.rb +3 -1
- data/spec/valvat/checksum/es_spec.rb +7 -4
- data/spec/valvat/checksum/fi_spec.rb +6 -4
- data/spec/valvat/checksum/fr_spec.rb +6 -4
- data/spec/valvat/checksum/gb_spec.rb +4 -2
- data/spec/valvat/checksum/gr_spec.rb +6 -4
- data/spec/valvat/checksum/hr_spec.rb +3 -1
- data/spec/valvat/checksum/hu_spec.rb +3 -1
- data/spec/valvat/checksum/ie_spec.rb +8 -6
- data/spec/valvat/checksum/it_spec.rb +10 -8
- data/spec/valvat/checksum/lt_spec.rb +3 -1
- data/spec/valvat/checksum/lu_spec.rb +6 -4
- data/spec/valvat/checksum/mt_spec.rb +3 -1
- data/spec/valvat/checksum/nl_spec.rb +9 -7
- data/spec/valvat/checksum/pl_spec.rb +8 -6
- data/spec/valvat/checksum/pt_spec.rb +10 -11
- data/spec/valvat/checksum/ro_spec.rb +3 -1
- data/spec/valvat/checksum/se_spec.rb +8 -6
- data/spec/valvat/checksum/si_spec.rb +10 -8
- data/spec/valvat/checksum_spec.rb +11 -9
- data/spec/valvat/lookup/fault_spec.rb +34 -0
- data/spec/valvat/lookup/request_spec.rb +19 -0
- data/spec/valvat/lookup/response_spec.rb +29 -0
- data/spec/valvat/lookup_spec.rb +138 -153
- data/spec/valvat/syntax_spec.rb +59 -280
- data/spec/valvat/utils_spec.rb +62 -47
- data/spec/valvat_spec.rb +140 -152
- data/valvat.gemspec +17 -17
- metadata +24 -27
- metadata.gz.sig +0 -0
- data/.travis.yml +0 -47
- data/gemfiles/activemodel-3-2 +0 -7
- data/gemfiles/activemodel-4 +0 -7
- data/gemfiles/before-ruby21/activemodel-3-2 +0 -8
- data/gemfiles/before-ruby21/activemodel-4 +0 -8
- data/gemfiles/before-ruby21/standalone +0 -7
- data/spec/valvat/lockup/fault_spec.rb +0 -32
- data/spec/valvat/lockup/request_spec.rb +0 -15
- data/spec/valvat/lockup/response_spec.rb +0 -27
data/lib/valvat/checksum/cy.rb
CHANGED
data/lib/valvat/checksum/de.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class DE < Base
|
@@ -8,12 +10,12 @@ class Valvat
|
|
8
10
|
prod = M
|
9
11
|
figures.each do |fig|
|
10
12
|
sum = (prod + fig).modulo(M)
|
11
|
-
sum = M if sum
|
12
|
-
prod = (2*sum).modulo(N)
|
13
|
+
sum = M if sum.zero?
|
14
|
+
prod = (2 * sum).modulo(N)
|
13
15
|
end
|
14
16
|
chk = N - prod
|
15
17
|
chk == 10 ? 0 : chk
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
19
|
-
end
|
21
|
+
end
|
data/lib/valvat/checksum/dk.rb
CHANGED
data/lib/valvat/checksum/ee.rb
CHANGED
data/lib/valvat/checksum/es.rb
CHANGED
@@ -1,33 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class ES < Base
|
4
|
-
NATURAL_PERSON_CHARS = %w
|
5
|
-
NATURAL_PERSON_EXP = /\A(
|
6
|
-
LEGAL_PERSON_CHARS = [false] + %w
|
7
|
-
LEGAL_PERSON_EXP = /\A[NPQRSW]
|
6
|
+
NATURAL_PERSON_CHARS = %w[T R W A G M Y F P D X B N J Z S Q V H L C K E].freeze
|
7
|
+
NATURAL_PERSON_EXP = /\A(\d{8}[ABCDEFGHJKLMNPQRSTVWXYZ]|[KLMXYZ]\d{7}[ABCDEFGHJKLMNPQRSTVWXYZ])\Z/.freeze
|
8
|
+
LEGAL_PERSON_CHARS = [false] + %w[A B C D E F G H I J]
|
9
|
+
LEGAL_PERSON_EXP = /\A[NPQRSW]\d{7}[ABCDEFGHIJ]\Z/.freeze
|
10
|
+
NIE_DIGIT_BY_LETTER = %w[X Y Z].freeze
|
8
11
|
|
9
12
|
def check_digit
|
10
13
|
natural_person? ? check_digit_natural_person : check_digit_legal_person
|
11
14
|
end
|
12
15
|
|
13
16
|
def check_digit_natural_person
|
14
|
-
nie_digit = nil
|
15
17
|
letter = vat.to_s_wo_country[0]
|
16
|
-
|
17
|
-
nie_digit = 0
|
18
|
-
elsif letter == 'Y'
|
19
|
-
nie_digit = 1
|
20
|
-
elsif letter == 'Z'
|
21
|
-
nie_digit = 2
|
22
|
-
end
|
18
|
+
nie_digit = NIE_DIGIT_BY_LETTER.index(letter)
|
23
19
|
NATURAL_PERSON_CHARS["#{nie_digit}#{figures_str}".to_i.modulo(23)]
|
24
20
|
end
|
25
21
|
|
26
22
|
def check_digit_legal_person
|
27
|
-
chk = 10 - sum_of_figures_for_at_es_it_se(true).modulo(10)
|
28
|
-
legal_foreign_person?
|
29
|
-
LEGAL_PERSON_CHARS[chk]
|
23
|
+
chk = 10 - sum_of_figures_for_at_es_it_se(reverse_ints: true).modulo(10)
|
24
|
+
if legal_foreign_person?
|
25
|
+
LEGAL_PERSON_CHARS[chk]
|
26
|
+
else
|
30
27
|
(chk == 10 ? 0 : chk)
|
28
|
+
end
|
31
29
|
end
|
32
30
|
|
33
31
|
def given_check_digit
|
@@ -52,4 +50,4 @@ class Valvat
|
|
52
50
|
end
|
53
51
|
end
|
54
52
|
end
|
55
|
-
end
|
53
|
+
end
|
data/lib/valvat/checksum/fi.rb
CHANGED
data/lib/valvat/checksum/fr.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class FR < Base
|
@@ -5,10 +7,10 @@ class Valvat
|
|
5
7
|
siren = str_wo_country[2..-1].to_i
|
6
8
|
(12 + (3 * siren) % 97) % 97
|
7
9
|
end
|
8
|
-
|
10
|
+
|
9
11
|
def given_check_digit
|
10
12
|
str_wo_country[0..1].to_i
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
14
|
-
end
|
16
|
+
end
|
data/lib/valvat/checksum/gb.rb
CHANGED
@@ -1,51 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class GB < Base
|
4
|
-
OLD_FORMAT_FORBIDDEN_RANGES = [(100_000..999_999), (9_490_001..9_700_000), (9_990_001..9_999_999)]
|
5
|
-
NEW_FORMAT_FORBIDDEN_RANGES = [(1..100_000), (100_001..1_000_000)]
|
6
|
-
GOV_NUMBER = /\A(GD[0-4]{1}\d{2})\Z
|
7
|
-
HEALTH_NUMBER = /\A(HA[5-9]{1}\d{2})\Z
|
8
|
-
|
9
|
-
def validate
|
10
|
-
vat_number = vat.to_s_wo_country
|
6
|
+
OLD_FORMAT_FORBIDDEN_RANGES = [(100_000..999_999), (9_490_001..9_700_000), (9_990_001..9_999_999)].freeze
|
7
|
+
NEW_FORMAT_FORBIDDEN_RANGES = [(1..100_000), (100_001..1_000_000)].freeze
|
8
|
+
GOV_NUMBER = /\A(GD[0-4]{1}\d{2})\Z/.freeze
|
9
|
+
HEALTH_NUMBER = /\A(HA[5-9]{1}\d{2})\Z/.freeze
|
11
10
|
|
11
|
+
def validate # rubocop:disable Metrics/CyclomaticComplexity
|
12
12
|
# government departments and health authorities, so no checksum
|
13
|
-
return true if gov_or_health?
|
14
|
-
return false if all_zero?
|
13
|
+
return true if gov_or_health?
|
14
|
+
return false if all_zero?
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
vat_base_int = vat_base.to_i
|
19
|
-
vat_base_sum = generate_vat_base_sum(vat_base)
|
16
|
+
return false if old_format_remainder.zero? && fobidden_in_old_format?
|
17
|
+
return false if new_format_remainder.zero? && fobidden_in_new_format?
|
20
18
|
|
21
|
-
old_format_remainder
|
22
|
-
|
19
|
+
old_format_remainder.zero? || new_format_remainder.zero?
|
20
|
+
end
|
23
21
|
|
24
|
-
|
25
|
-
OLD_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include? vat_base_int }
|
22
|
+
private
|
26
23
|
|
27
|
-
|
28
|
-
|
24
|
+
def checksum
|
25
|
+
@checksum ||= str_wo_country[7..8].to_i
|
26
|
+
end
|
29
27
|
|
30
|
-
|
28
|
+
def vat_base
|
29
|
+
@vat_base ||= str_wo_country[0..6]
|
31
30
|
end
|
32
31
|
|
33
|
-
|
32
|
+
def gov_or_health?
|
33
|
+
str_wo_country =~ GOV_NUMBER || str_wo_country =~ HEALTH_NUMBER
|
34
|
+
end
|
34
35
|
|
35
|
-
def
|
36
|
-
|
36
|
+
def all_zero?
|
37
|
+
str_wo_country =~ /\A0{9}\Z/ || str_wo_country =~ /\A0{12}\Z/
|
37
38
|
end
|
38
39
|
|
39
|
-
def
|
40
|
-
|
40
|
+
def vat_base_sum
|
41
|
+
@vat_base_sum ||= vat_base.split('')
|
42
|
+
.map(&:to_i)
|
43
|
+
.zip([8, 7, 6, 5, 4, 3, 2])
|
44
|
+
.map { |vat_number_digit, multiplier| vat_number_digit * multiplier }
|
45
|
+
.inject(:+)
|
41
46
|
end
|
42
47
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
48
|
+
def old_format_remainder
|
49
|
+
@old_format_remainder ||= (vat_base_sum + checksum).modulo(97)
|
50
|
+
end
|
51
|
+
|
52
|
+
def new_format_remainder
|
53
|
+
@new_format_remainder ||= (vat_base_sum + 55 + checksum).modulo(97)
|
54
|
+
end
|
55
|
+
|
56
|
+
def fobidden_in_new_format?
|
57
|
+
vat_base_int = vat_base.to_i
|
58
|
+
NEW_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include?(vat_base_int) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def fobidden_in_old_format?
|
62
|
+
vat_base_int = vat_base.to_i
|
63
|
+
OLD_FORMAT_FORBIDDEN_RANGES.any? { |range| range.include?(vat_base_int) }
|
49
64
|
end
|
50
65
|
end
|
51
66
|
end
|
data/lib/valvat/checksum/gr.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class GR < Base
|
4
6
|
def check_digit
|
5
7
|
chk = sum_figures_by do |fig, i|
|
6
|
-
fig*(2**(i+1))
|
8
|
+
fig * (2**(i + 1))
|
7
9
|
end.modulo(11)
|
8
10
|
chk > 9 ? 0 : chk
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
12
|
-
end
|
14
|
+
end
|
data/lib/valvat/checksum/hr.rb
CHANGED
data/lib/valvat/checksum/hu.rb
CHANGED
data/lib/valvat/checksum/ie.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class IE < Base
|
4
6
|
def check_digit
|
5
7
|
total = sum_figures_by do |fig, i|
|
6
|
-
fig*(i+2)
|
7
|
-
end
|
8
|
-
if str_wo_country.size == 9
|
9
|
-
total += ((CHARS.index(str_wo_country[8]) || 0) * 9)
|
8
|
+
fig * (i + 2)
|
10
9
|
end
|
10
|
+
total += ((CHARS.index(str_wo_country[8]) || 0) * 9) if str_wo_country.size == 9
|
11
11
|
total.modulo(23)
|
12
12
|
end
|
13
13
|
|
14
|
-
CHARS =
|
14
|
+
CHARS = 'WABCDEFGHIJKLMNOPQRSTUV'.split('')
|
15
15
|
|
16
16
|
def given_check_digit
|
17
17
|
if str_wo_country.size == 9
|
@@ -38,7 +38,6 @@ class Valvat
|
|
38
38
|
super
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
42
41
|
end
|
43
42
|
end
|
44
43
|
end
|
data/lib/valvat/checksum/it.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class IT < Base
|
4
6
|
def validate
|
5
7
|
y = figures_str[7..9].to_i
|
6
8
|
y >= 1 && (y <= 100 || [120, 121].include?(y)) &&
|
7
|
-
|
8
|
-
|
9
|
+
figures_str[0..6] != '0000000' &&
|
10
|
+
super
|
9
11
|
end
|
10
12
|
|
11
13
|
def check_digit
|
12
|
-
chk = 10 - sum_of_figures_for_at_es_it_se(true).modulo(10)
|
14
|
+
chk = 10 - sum_of_figures_for_at_es_it_se(reverse_ints: true).modulo(10)
|
13
15
|
chk == 10 ? 0 : chk
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
17
|
-
end
|
19
|
+
end
|
data/lib/valvat/checksum/lt.rb
CHANGED
data/lib/valvat/checksum/lu.rb
CHANGED
data/lib/valvat/checksum/mt.rb
CHANGED
data/lib/valvat/checksum/nl.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class NL < Base
|
4
6
|
def validate
|
5
7
|
vat.to_s.gsub(/[A-Z]/) { |let| (let.ord - 55).to_s }.to_i % 97 == 1 ||
|
6
|
-
|
8
|
+
super
|
7
9
|
end
|
8
10
|
|
9
11
|
def check_digit
|
10
12
|
sum_figures_by do |fig, i|
|
11
|
-
fig*(i+2)
|
13
|
+
fig * (i + 2)
|
12
14
|
end.modulo(11)
|
13
15
|
end
|
14
16
|
|
@@ -17,4 +19,4 @@ class Valvat
|
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
20
|
-
end
|
22
|
+
end
|
data/lib/valvat/checksum/pl.rb
CHANGED
data/lib/valvat/checksum/pt.rb
CHANGED
data/lib/valvat/checksum/ro.rb
CHANGED
data/lib/valvat/checksum/se.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Valvat
|
2
4
|
module Checksum
|
3
5
|
class SE < Base
|
4
6
|
check_digit_length 0
|
5
7
|
|
6
8
|
def validate
|
7
|
-
vat.to_s_wo_country[-2..-1].to_i
|
8
|
-
|
9
|
+
vat.to_s_wo_country[-2..-1].to_i.positive? &&
|
10
|
+
super
|
9
11
|
end
|
10
12
|
|
11
13
|
private
|
@@ -23,4 +25,4 @@ class Valvat
|
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
26
|
-
end
|
28
|
+
end
|
data/lib/valvat/checksum/si.rb
CHANGED
data/lib/valvat/error.rb
CHANGED