valvat 0.4.7 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rbenv-version +1 -1
- data/CHANGES.md +8 -1
- data/Guardfile +1 -1
- data/README.md +27 -2
- data/lib/valvat.rb +5 -0
- data/lib/valvat/active_model.rb +4 -1
- data/lib/valvat/checksum.rb +60 -0
- data/lib/valvat/checksum/at.rb +18 -0
- data/lib/valvat/checksum/be.rb +13 -0
- data/lib/valvat/checksum/bg.rb +61 -0
- data/lib/valvat/checksum/de.rb +21 -0
- data/lib/valvat/checksum/dk.rb +20 -0
- data/lib/valvat/checksum/es.rb +45 -0
- data/lib/valvat/checksum/fi.rb +15 -0
- data/lib/valvat/checksum/gr.rb +14 -0
- data/lib/valvat/checksum/ie.rb +29 -0
- data/lib/valvat/checksum/it.rb +22 -0
- data/lib/valvat/checksum/lu.rb +13 -0
- data/lib/valvat/checksum/nl.rb +17 -0
- data/lib/valvat/checksum/pl.rb +14 -0
- data/lib/valvat/checksum/pt.rb +14 -0
- data/lib/valvat/checksum/se.rb +30 -0
- data/lib/valvat/checksum/si.rb +19 -0
- data/lib/valvat/lookup.rb +8 -5
- data/lib/valvat/lookup/request.rb +1 -3
- data/lib/valvat/syntax.rb +0 -1
- data/lib/valvat/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/valvat/active_model_spec.rb +18 -0
- data/spec/valvat/checksum/at_spec.rb +15 -0
- data/spec/valvat/checksum/be_spec.rb +15 -0
- data/spec/valvat/checksum/bg_spec.rb +15 -0
- data/spec/valvat/checksum/de_spec.rb +15 -0
- data/spec/valvat/checksum/dk_spec.rb +15 -0
- data/spec/valvat/checksum/es_spec.rb +15 -0
- data/spec/valvat/checksum/fi_spec.rb +15 -0
- data/spec/valvat/checksum/gr_spec.rb +15 -0
- data/spec/valvat/checksum/ie_spec.rb +15 -0
- data/spec/valvat/checksum/it_spec.rb +23 -0
- data/spec/valvat/checksum/lu_spec.rb +15 -0
- data/spec/valvat/checksum/nl_spec.rb +15 -0
- data/spec/valvat/checksum/pl_spec.rb +19 -0
- data/spec/valvat/checksum/pt_spec.rb +15 -0
- data/spec/valvat/checksum/se_spec.rb +19 -0
- data/spec/valvat/checksum/si_spec.rb +23 -0
- data/spec/valvat/checksum_spec.rb +25 -0
- data/spec/valvat/lookup_spec.rb +1 -1
- data/spec/valvat_spec.rb +13 -0
- data/valvat.gemspec +2 -1
- metadata +83 -44
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'valvat/checksum'
|
2
|
+
|
3
|
+
class Valvat
|
4
|
+
module Checksum
|
5
|
+
class NL < Base
|
6
|
+
def check_digit
|
7
|
+
figures.reverse.each_with_index.map do |fig, i|
|
8
|
+
fig*(i+2)
|
9
|
+
end.inject(:+).modulo(11)
|
10
|
+
end
|
11
|
+
|
12
|
+
def str_wo_country
|
13
|
+
super[0..-4]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'valvat/checksum'
|
2
|
+
|
3
|
+
class Valvat
|
4
|
+
module Checksum
|
5
|
+
class SE < Base
|
6
|
+
check_digit_length 0
|
7
|
+
|
8
|
+
def validate
|
9
|
+
vat.to_s_wo_country[-2..-1].to_i > 0 &&
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def check_digit
|
16
|
+
figures.reverse.each_with_index.map do |fig, i|
|
17
|
+
(fig*(i.modulo(2) == 0 ? 1 : 2)).to_s.split("").inject(0) { |sum, n| sum + n.to_i }
|
18
|
+
end.inject(:+).modulo(10)
|
19
|
+
end
|
20
|
+
|
21
|
+
def given_check_digit
|
22
|
+
0
|
23
|
+
end
|
24
|
+
|
25
|
+
def str_wo_country
|
26
|
+
vat.to_s_wo_country[0..9]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'valvat/checksum'
|
2
|
+
|
3
|
+
class Valvat
|
4
|
+
module Checksum
|
5
|
+
class SI < Base
|
6
|
+
def validate
|
7
|
+
figures_str.to_i > 999999 &&
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
def check_digit
|
12
|
+
chk = 11 - figures.reverse.each_with_index.map do |fig, i|
|
13
|
+
fig*(i+2)
|
14
|
+
end.inject(:+).modulo(11)
|
15
|
+
chk == 1 ? 0 : chk
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/valvat/lookup.rb
CHANGED
@@ -31,13 +31,16 @@ class Valvat
|
|
31
31
|
# Require Savon only if really needed!
|
32
32
|
require 'savon' unless defined?(Savon)
|
33
33
|
|
34
|
-
# Quiet down
|
35
|
-
Savon.configure do |config|
|
36
|
-
config.log = false
|
37
|
-
end
|
34
|
+
# Quiet down HTTPI
|
38
35
|
HTTPI.log = false
|
39
36
|
|
40
|
-
Savon::Client.new(
|
37
|
+
Savon::Client.new(
|
38
|
+
wsdl: 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl',
|
39
|
+
namespace: 'urn:ec.europa.eu:taxud:vies:services:checkVat:types',
|
40
|
+
namespaces: {'xmlns:impl'=>'urn:ec.europa.eu:taxud:vies:services:checkVat:types'},
|
41
|
+
# Quiet down Savon
|
42
|
+
log: false
|
43
|
+
)
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
data/lib/valvat/syntax.rb
CHANGED
data/lib/valvat/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -11,6 +11,7 @@ RSpec.configure do |config|
|
|
11
11
|
config.treat_symbols_as_metadata_keys_with_true_values = true
|
12
12
|
config.filter_run :focus => true
|
13
13
|
config.run_all_when_everything_filtered = true
|
14
|
+
config.backtrace_exclusion_patterns = [/rspec\/(core|expectations)/]
|
14
15
|
end
|
15
16
|
|
16
17
|
class ModelBase
|
@@ -36,6 +36,10 @@ class InvoiceCheckCountryWithLookup < ModelBase
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
class InvoiceWithChecksum < ModelBase
|
40
|
+
validates :vat_number, :valvat => {:checksum => true}
|
41
|
+
end
|
42
|
+
|
39
43
|
describe Invoice do
|
40
44
|
context "with valid vat number" do
|
41
45
|
it "should be valid" do
|
@@ -220,3 +224,17 @@ describe InvoiceCheckCountryWithLookup do
|
|
220
224
|
InvoiceCheckCountryWithLookup.new(:country => "DE", :vat_number => "DE259597697").valid?
|
221
225
|
end
|
222
226
|
end
|
227
|
+
|
228
|
+
describe InvoiceWithChecksum do
|
229
|
+
context "with valid vat number" do
|
230
|
+
it "should be valid" do
|
231
|
+
InvoiceWithChecksum.new(:vat_number => "DE259597697").should be_valid
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context "with invalid vat number" do
|
236
|
+
it "should not be valid" do
|
237
|
+
InvoiceWithChecksum.new(:vat_number => "DE259597687").should_not be_valid
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::AT do
|
4
|
+
%w(ATU13585627 ATU66059506 ATU42403001).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-4]}#{valid_vat[-1]}#{valid_vat[-2]}#{valid_vat[-3]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::BE do
|
4
|
+
%w(BE0123456749 BE0136695962 BE0817331995).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-3]}#{valid_vat[-1]}#{valid_vat[-2]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::BG do
|
4
|
+
%w(BG123456786 BG926067143 BG926067770 BG0101011739 BG0121013021 BG5041019992 BG1521687837 BG1431889037).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-4]}#{valid_vat[-1]}#{valid_vat[-2]}#{valid_vat[-4]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::DE do
|
4
|
+
%w(DE280857971 DE281381706 DE283108332 DE813622378 DE813628528 DE814178359 DE811907980).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-3]}#{valid_vat[-1]}#{valid_vat[-2]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::DK do
|
4
|
+
%w(DK13585628 DK61126228).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-3]}#{valid_vat[-1]}#{valid_vat[-2]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::ES do
|
4
|
+
%w(ESA13585625 ESB83871236 ESE54507058 ES25139013J ESQ1518001A ESQ5018001G ESX4942978W ESX7676464F ESB10317980).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-6]}#{valid_vat[-2]}#{valid_vat[-5]}#{valid_vat[-4]}#{valid_vat[-3]}#{valid_vat[-1]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::FI do
|
4
|
+
%w(FI13669598 FI20584306 FI01080233).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-4]}#{valid_vat[-1]}#{valid_vat[-2]}#{valid_vat[-3]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::GR do
|
4
|
+
%w(EL123456783 EL094543092 EL998219694).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-3]}#{valid_vat[-1]}#{valid_vat[-2]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::IE do
|
4
|
+
%w(IE8473625E IE0123459N IE9B12345N).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-4]}#{valid_vat[-2]}#{valid_vat[-3]}#{valid_vat[-1]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::IT do
|
4
|
+
%w(IT12345670785 IT01897810162 IT00197200132 IT02762750210).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-3]}#{valid_vat[-1]}#{valid_vat[-2]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns false on invalid special case vat IT12345671783" do
|
17
|
+
Valvat::Checksum.validate("IT12345671783").should eql(false)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns false on invalid special case vat IT00000000133" do
|
21
|
+
Valvat::Checksum.validate("IT00000000133").should eql(false)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::LU do
|
4
|
+
%w(LU13669580 LU25361352 LU23124018 LU17560609).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-4]}#{valid_vat[-2]}#{valid_vat[-3]}#{valid_vat[-1]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::NL do
|
4
|
+
%w(NL123456782B12 NL802549391B01 NL808661863B01 NL820893559B01).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-5]}#{valid_vat[-2]}#{valid_vat[-3]}#{valid_vat[-4]}#{valid_vat[-1]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::PL do
|
4
|
+
%w(PL8567346215 PL5260211587 PL9720575348 PL5272650022).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-4]}#{valid_vat[-1]}#{valid_vat[-2]}#{valid_vat[-3]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "returns false on special case invalid vat PL8566445330" do
|
17
|
+
Valvat::Checksum.validate("PL8566445330").should eql(false)
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valvat::Checksum::PT do
|
4
|
+
%w(PT136695973 PT501413197 PT503037753 PT500243590 PT500100144 PT502921838).each do |valid_vat|
|
5
|
+
it "returns true on valid vat #{valid_vat}" do
|
6
|
+
Valvat::Checksum.validate(valid_vat).should eql(true)
|
7
|
+
end
|
8
|
+
|
9
|
+
invalid_vat = "#{valid_vat[0..-5]}#{valid_vat[-1]}#{valid_vat[-4]}#{valid_vat[-2]}#{valid_vat[-3]}"
|
10
|
+
|
11
|
+
it "returns false on invalid vat #{invalid_vat}" do
|
12
|
+
Valvat::Checksum.validate(invalid_vat).should eql(false)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|