Sha256: 3a3f5abeeead3c97a88f884a22f06ded0a65712cd7bbeca82183f05e6d4b45cb

Contents?: true

Size: 1.84 KB

Versions: 1

Compression:

Stored size: 1.84 KB

Contents

require 'vat_rates/version'
require 'open-uri'
require 'nokogiri'
require 'oj'

module VatRates
  URL = 'http://ec.europa.eu/taxation_customs/tic/public/vatRates/vatratesSearch.html'
  FILEPATH = File.expand_path('../../data.json', __FILE__)

  class << self
    def fetch
      html = open(URL)

      doc = Nokogiri::HTML(html)

      data = []

      content = doc.css('#tic-content').first

      content.children.each do |child|
        if child.name == 'h2'
          code, name = child.text.split(' - ')

          data << {
            code: code,
            name: name,
            rate: normalize_rate(child.next.next.next.next.css('td')[1].text)
          }
        elsif child.name == 'h4'
          data.last[:regions] ||= []
          region = {
            name: child.text
          }

          standard = child.next.next.next.next

          if standard.text.include?('No Standard Rate')
            region[:rate] = 0
          else
            region[:rate] = normalize_rate(standard.css('td')[1].text)
          end

          reduced = standard.next.next.next.next.next.next

          unless reduced.text.include?('No information available')
            reduced.css('tr')[1..-1].each do |row|
              columns = row.css('td')
              region[:reduced_rates] = {
                category: columns[0].text,
                rate: normalize_rate(columns[1].text)
              }
            end
          end

          data.last[:regions] << region
        end
      end

      data
    end

    def load(filepath = FILEPATH)
      if filepath
        Oj.load(File.read(filepath))
      else
        get_rates
      end
    end

    def save(filepath)
      File.open(filepath, 'w') do |file|
        file.write(Oj.dump(fetch))
      end
    end

    private

    def normalize_rate(number)
      number.sub(',', '.').gsub(/[% ]/, '').to_f
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
vat_rates-0.0.2 lib/vat_rates.rb