valvat 0.4.7 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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