valvat 0.4.7 → 0.5.0
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 +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
|