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.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.rbenv-version +1 -1
  3. data/CHANGES.md +8 -1
  4. data/Guardfile +1 -1
  5. data/README.md +27 -2
  6. data/lib/valvat.rb +5 -0
  7. data/lib/valvat/active_model.rb +4 -1
  8. data/lib/valvat/checksum.rb +60 -0
  9. data/lib/valvat/checksum/at.rb +18 -0
  10. data/lib/valvat/checksum/be.rb +13 -0
  11. data/lib/valvat/checksum/bg.rb +61 -0
  12. data/lib/valvat/checksum/de.rb +21 -0
  13. data/lib/valvat/checksum/dk.rb +20 -0
  14. data/lib/valvat/checksum/es.rb +45 -0
  15. data/lib/valvat/checksum/fi.rb +15 -0
  16. data/lib/valvat/checksum/gr.rb +14 -0
  17. data/lib/valvat/checksum/ie.rb +29 -0
  18. data/lib/valvat/checksum/it.rb +22 -0
  19. data/lib/valvat/checksum/lu.rb +13 -0
  20. data/lib/valvat/checksum/nl.rb +17 -0
  21. data/lib/valvat/checksum/pl.rb +14 -0
  22. data/lib/valvat/checksum/pt.rb +14 -0
  23. data/lib/valvat/checksum/se.rb +30 -0
  24. data/lib/valvat/checksum/si.rb +19 -0
  25. data/lib/valvat/lookup.rb +8 -5
  26. data/lib/valvat/lookup/request.rb +1 -3
  27. data/lib/valvat/syntax.rb +0 -1
  28. data/lib/valvat/version.rb +1 -1
  29. data/spec/spec_helper.rb +1 -0
  30. data/spec/valvat/active_model_spec.rb +18 -0
  31. data/spec/valvat/checksum/at_spec.rb +15 -0
  32. data/spec/valvat/checksum/be_spec.rb +15 -0
  33. data/spec/valvat/checksum/bg_spec.rb +15 -0
  34. data/spec/valvat/checksum/de_spec.rb +15 -0
  35. data/spec/valvat/checksum/dk_spec.rb +15 -0
  36. data/spec/valvat/checksum/es_spec.rb +15 -0
  37. data/spec/valvat/checksum/fi_spec.rb +15 -0
  38. data/spec/valvat/checksum/gr_spec.rb +15 -0
  39. data/spec/valvat/checksum/ie_spec.rb +15 -0
  40. data/spec/valvat/checksum/it_spec.rb +23 -0
  41. data/spec/valvat/checksum/lu_spec.rb +15 -0
  42. data/spec/valvat/checksum/nl_spec.rb +15 -0
  43. data/spec/valvat/checksum/pl_spec.rb +19 -0
  44. data/spec/valvat/checksum/pt_spec.rb +15 -0
  45. data/spec/valvat/checksum/se_spec.rb +19 -0
  46. data/spec/valvat/checksum/si_spec.rb +23 -0
  47. data/spec/valvat/checksum_spec.rb +25 -0
  48. data/spec/valvat/lookup_spec.rb +1 -1
  49. data/spec/valvat_spec.rb +13 -0
  50. data/valvat.gemspec +2 -1
  51. metadata +83 -44
@@ -0,0 +1,13 @@
1
+ require 'valvat/checksum'
2
+
3
+ class Valvat
4
+ module Checksum
5
+ class LU < Base
6
+ check_digit_length 2
7
+
8
+ def check_digit
9
+ figures_str.to_i.modulo(89)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -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,14 @@
1
+ require 'valvat/checksum'
2
+
3
+ class Valvat
4
+ module Checksum
5
+ class PL < Base
6
+ def check_digit
7
+ weight = [6, 5, 7, 2, 3, 4, 5, 6, 7]
8
+ figures.map do |fig|
9
+ fig * weight.shift
10
+ end.inject(:+).modulo(11)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require 'valvat/checksum'
2
+
3
+ class Valvat
4
+ module Checksum
5
+ class PT < Base
6
+ def check_digit
7
+ chk = 11 - figures.reverse.each_with_index.map do |fig, i|
8
+ fig*(i+2)
9
+ end.inject(:+).modulo(11)
10
+ chk > 9 ? 0 : chk
11
+ end
12
+ end
13
+ end
14
+ 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 Savon and HTTPI
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('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl')
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
 
@@ -6,9 +6,7 @@ class Valvat
6
6
  end
7
7
 
8
8
  def perform(client)
9
- client.request(action) do |r|
10
- r.body = body
11
- end.to_hash[response_key]
9
+ client.call(action, :message => body).to_hash[response_key]
12
10
  end
13
11
 
14
12
  private
data/lib/valvat/syntax.rb CHANGED
@@ -40,5 +40,4 @@ class Valvat
40
40
  !!(pattern && pattern =~ vat.to_s)
41
41
  end
42
42
  end
43
-
44
43
  end
@@ -1,3 +1,3 @@
1
1
  class Valvat
2
- VERSION = "0.4.7"
2
+ VERSION = "0.5.0"
3
3
  end
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