2024-11-12 12:34:04 +01:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require_relative "vat_rate/version"
|
|
|
|
|
2024-11-12 14:37:26 +01:00
|
|
|
require 'psych'
|
|
|
|
require 'date'
|
|
|
|
|
|
|
|
class VatRate
|
|
|
|
CATEGORIES = %i(standard parking reduced super_reduced)
|
|
|
|
RATES = Psych.safe_load_file(__dir__ + "/vat_rate.yml", permitted_classes: [Date])
|
|
|
|
|
|
|
|
def initialize(country:, category: :standard, date: Date.today, rate: nil)
|
|
|
|
raise ArgumentError unless CATEGORIES.include?(category)
|
|
|
|
|
|
|
|
@category = category
|
|
|
|
@country = country.to_s
|
|
|
|
@date = date
|
|
|
|
|
|
|
|
if rate
|
|
|
|
@rate = rate
|
|
|
|
elsif RATES["#{@category}_rates"].key?(@country)
|
|
|
|
@rate = RATES["#{@category}_rates"][@country].detect do |rate_data|
|
|
|
|
if rate
|
|
|
|
rate == rate_data['rate']
|
|
|
|
else
|
|
|
|
!rate_data.key?('from') || date.to_date >= rate_data['from']
|
|
|
|
end
|
|
|
|
end&.fetch('rate') || 0
|
|
|
|
else
|
|
|
|
@rate = 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
attr_reader :rate
|
|
|
|
|
|
|
|
def amount_with_vat(amount)
|
|
|
|
amount * (100 + @rate) / 100.0
|
|
|
|
end
|
|
|
|
|
|
|
|
def amount_without_vat(amount)
|
|
|
|
amount * 100.0 / (100 + @rate)
|
|
|
|
end
|
|
|
|
|
|
|
|
def vat_amount(amount, has_vat: false)
|
|
|
|
if has_vat
|
|
|
|
amount * @rate / (100.0 + @rate)
|
|
|
|
else
|
|
|
|
amount * @rate / 100.0
|
|
|
|
end
|
|
|
|
end
|
2024-11-12 12:34:04 +01:00
|
|
|
end
|