Module: EuVatRatesData

Defined in:
lib/eu_vat_rates_data.rb,
lib/eu_vat_rates_data/version.rb

Overview

VAT rates for 44 European countries (EU-27 + 17 non-EU).

EU rates sourced from the European Commission TEDB (Taxes in Europe Database), checked daily. Non-EU rates maintained manually.

Usage:

require "eu_vat_rates_data"

EuVatRatesData.get_rate("FI")
# => {"country"=>"Finland", "currency"=>"EUR", "eu_member"=>true,
#     "standard"=>25.5, "reduced"=>[10.0, 13.5], "super_reduced"=>nil, "parking"=>nil}

EuVatRatesData.get_standard_rate("DE")  # => 19.0
EuVatRatesData.eu_member?("NO")         # => false
EuVatRatesData.eu_member?("FR")         # => true
EuVatRatesData.data_version             # => "2026-03-18"

Constant Summary collapse

DATA_FILE =
File.expand_path("../../data/eu-vat-rates-data.json", __dir__)
VERSION =
"2026.3.18"

Class Method Summary collapse

Class Method Details

.all_ratesHash{String => Hash}

Return all 44 country rate hashes keyed by ISO country code.

Returns:

  • (Hash{String => Hash})


50
51
52
# File 'lib/eu_vat_rates_data.rb', line 50

def self.all_rates
  rates.dup
end

.data_versionString

Return the ISO 8601 date when EU data was last fetched from EC TEDB.

Returns:

  • (String)

    e.g. “2026-03-18”



65
66
67
# File 'lib/eu_vat_rates_data.rb', line 65

def self.data_version
  dataset["version"]
end

.datasetObject



25
26
27
# File 'lib/eu_vat_rates_data.rb', line 25

def self.dataset
  @dataset ||= JSON.parse(File.read(DATA_FILE, encoding: "utf-8"))
end

.eu_member?(country_code) ⇒ Boolean

Return true if the country is an EU-27 member state. Returns false for non-EU countries (GB, NO, CH, etc.) and unknown codes.

Parameters:

  • country_code (String)

    ISO 3166-1 alpha-2 code

Returns:

  • (Boolean)


58
59
60
61
# File 'lib/eu_vat_rates_data.rb', line 58

def self.eu_member?(country_code)
  rate = get_rate(country_code)
  rate ? rate["eu_member"] == true : false
end

.get_rate(country_code) ⇒ Hash?

Return the full rate hash for a country, or nil if not found.

Parameters:

  • country_code (String)

    ISO 3166-1 alpha-2 code (e.g. “FI”, “DE”, “NO”)

Returns:

  • (Hash, nil)


36
37
38
# File 'lib/eu_vat_rates_data.rb', line 36

def self.get_rate(country_code)
  rates[country_code.upcase]
end

.get_standard_rate(country_code) ⇒ Float?

Return the standard VAT rate for a country, or nil if not found.

Parameters:

  • country_code (String)

    ISO 3166-1 alpha-2 code

Returns:

  • (Float, nil)


43
44
45
46
# File 'lib/eu_vat_rates_data.rb', line 43

def self.get_standard_rate(country_code)
  rate = get_rate(country_code)
  rate&.fetch("standard")
end

.ratesObject



29
30
31
# File 'lib/eu_vat_rates_data.rb', line 29

def self.rates
  dataset["rates"]
end